callback不是一个function节点js

我是新来的JavaScript,我有麻烦解决这个错误。 我得到的消息:“callback是不是一个函数”在:“callback(angular色arrays)”。

Rol.getAllRoles = function(callback){ sql = "select role from Role;"; var rolesArray = []; var role; mysql.connection(function(err,conn){ if (err){ return callback(err); } conn.query(sql,function(err,rows){ if (err){ return callback(err); } for(var i=0; i < rows.length; i++){ role = rows[i].role; rolesArray.push(rol); } console.log("roles: " + rolesArray); return callback(rolesArray); }); }); } 

console.log输出:“roles:admin,customer”,以便与数据库的连接工作。

这个错误意味着当你调用它的时候你没有传递一个函数给Rol.getAllRoles(fn) 。 所以,你可以在你的callback中有适当的error handling,所以你可以更容易区分错误和你应该改变的实际数据,你总是传递第一个参数到callback,指出是否有错误,然后第二个参数(如果不是错误)可以是你的结果数组像这样:

 Rol.getAllRoles = function(callback){ sql = "select role from Role;"; var rolesArray = []; var role; mysql.connection(function(err,conn){ if (err){ return callback(err); } conn.query(sql,function(err,rows){ if (err){ return callback(err); } for(var i=0; i < rows.length; i++){ role = rows[i].role; rolesArray.push(rol); } console.log("roles: " + rolesArray); // make sure the first argument to the callback // is an error value, null if no error return callback(null, rolesArray); }); }); } 

然后,你应该这样称呼它:

 Rol.getAllRoles(function(err, rolesArray) { if (err) { // handle error here } else { // process rolesArray here } }); 

这种在callback(err, data)中调用asynchronouscallback的风格是非常常见的asynchronouscallbackdevise模式。 它允许所有来电者查看是否有错误,以及是否没有错误来获得最终结果。

我会build议如下:

 Rol.getAllRoles = function(callback){ var sql = "select role from Role;"; var rolesArray = []; var role; callback = callback || function(){}; mysql.connection(function(err,conn){ if (err){ return callback(err); } conn.query(sql,function(err,rows){ if (err){ return callback(err); } for(var i=0; i < rows.length; i++){ role = rows[i].role; rolesArray.push(rol); } console.log("roles: " + rolesArray); return callback(rolesArray); }); }); }