Javascript Node.js错误类型错误:对象不是回调函数

Javascript Node.js错误类型错误:对象不是回调函数,javascript,mysql,node.js,async.js,Javascript,Mysql,Node.js,Async.js,好了,伙计们,我一直在看这段代码,但我没有看到代码中的错误。我的代码正在连接到DB fine,我的控制台日志将我的结果显示为 { id: 7, name: 'Tap\'s', quicklist: 'Y', message: 'Welcome..enjoy one of our many craft brews!', fbflag: 'Y', facebookurl: 'https://www.facebook.com/TapsPourhouseMooresville', twflag: 'Y'

好了,伙计们,我一直在看这段代码,但我没有看到代码中的错误。我的代码正在连接到DB fine,我的控制台日志将我的结果显示为

{ id: 7,
name: 'Tap\'s',
quicklist: 'Y',
message: 'Welcome..enjoy one of our many craft brews!',
fbflag: 'Y',
facebookurl: 'https://www.facebook.com/TapsPourhouseMooresville',
twflag: 'Y',
twitterurl: 'https://twitter.com/TapsPourhouse',
contactflag: 'Y',
contactemail: 'info@blazingpoint.com',
eventsflag: 'Y',
loyaltyflag: 'Y',
loyaltyclub: 'TAPped In',
loyaltymessage: 'Become a member of the TAPped In Club in order to receive special offers and to stay informed on upcoming events and exclusive offers!',
locdescription: 'Table 10' }
这正是我想要得到的回报,但我一直得到 TypeError:对象不是函数 参考下面评论的行

exports.get_site_setup = function (callback) {
var dbc;

async.waterfall([
    // get a connection
    function (cb) {
//           if (!name)
//               cb(backhelp.missing_data("site name"));
//           else
              db.db(cb);
    },

    function (dbclient, cb) {
        dbc = dbclient;
        dbc.query("select s.ID as id, s.NAME as name, s.QUICK_LIST_ENABLED as quicklist, s.MESSAGE as message, s.FBFLAG as fbflag, "+
                "s.FACEBOOKURL as facebookurl, s.TWFLAG as twflag, s.TWITTERURL as twitterurl, "+
                "s.CONTACTFLAG as contactflag, s.CONTACTEMAIL as contactemail, s.EVENTSFLAG as eventsflag, "+
                "s.LOYALTYFLAG as loyaltyflag, s.LOYALTYCLUB as loyaltyclub, s.LOYALTYMESSAGE as loyaltymessage, l.LOCDESC locdescription "+
                "from COMPANIES as c "+
                "left join SITES as s on c.ID = s.COMPANY_ID "+
                "left join LOCATION as l on s.ID = l.SITE_ID "+
                "where c.ID = 7 and s.ID = 7 and l.ID = 8",
                cb);
    }

],
function (err, results) {
    if (dbc) {dbc.end();}
    if (err) {
       callback(err);
    } else if (!results || results.length === 0) {
       // callback(backhelp.no_such_site());
    } else {
        callback(null, results[0]); //  <-- Error on this line
        console.log(results[0]);
    }
});
};
exports.get\u site\u setup=函数(回调){
var-dbc;
异步瀑布([
//接通
功能(cb){
//如果(!name)
//cb(backhelp.missing_数据(“站点名称”));
//否则
db.db(cb);
},
函数(dbclient,cb){
dbc=dbclient;
dbc.query(“选择s.ID作为ID,选择s.NAME作为NAME,选择s.QUICK\u LIST\u作为quicklist启用,选择s.MESSAGE作为MESSAGE,选择s.FBFLAG作为FBFLAG,”+
s.FACEBOOKURL作为FACEBOOKURL,s.TWFLAG作为TWFLAG,s.TWITTERURL作为TWITTERURL+
s.CONTACTFLAG作为CONTACTFLAG,s.CONTACTEMAIL作为CONTACTEMAIL,s.EVENTSFLAG作为EVENTSFLAG+
“s.LOYALTYFLAG作为LOYALTYFLAG,s.LOYALTYCLUB作为LOYALTYCLUB,s.LOYALTYMESSAGE作为LOYALTYMESSAGE,l.LOCDESC locdescription”+
“来自c类公司”+
“在c.ID=s.COMPANY\u ID上以s的身份左键加入站点”+
“左连接位置为s.ID=l.SITE\U ID上的l”+
“其中c.ID=7,s.ID=7,l.ID=8”,
cb);
}
],
功能(错误、结果){
if(dbc){dbc.end();}
如果(错误){
回调(err);
}如果(!results | | results.length==0),则为else{
//回调(backhelp.no_这样的站点());
}否则{

callback(null,results[0]);//如果查看瀑布式的文档,您将看到回调按数组的顺序调用,并且在处理完数组的所有元素后调用最终函数(err,results)

所以在你第一次回电话时

 function (cb) {
//           if (!name)
//               cb(backhelp.missing_data("site name"));
//           else
              db.db(cb);
    },
引用db.db(cb)时,该函数是否调用cb(null,dbclient,cb)以转到数组中指定的下一个函数

然后在发生dbc.query的第二个函数中,您需要确保查询调用cb(null,预期结果)

空值指示瀑布没有错误并继续

另外,结果变量可能是字符串而不是数组。请检查此项。 因为如果是字符串(很可能是您的问题),则此测试将通过

} else if (!results || results.length === 0) {

您应该通过回调返回数据,而不是设置globals来捕获数据。此外,您不能只传递参数
dbclient
,而期望回调突然成为第二个参数。@adeneo您能为我详细说明一下吗?谢谢