【问题标题】:Node.js error TypeError: object is not a function on callbackNode.js 错误 TypeError:对象不是回调函数
【发布时间】:2014-01-31 08:12:20
【问题描述】:

好的,伙计们..我一直在盯着这段代码,只是没有在我的代码中看到错误。我的代码连接到数据库正常,我的控制台日志显示我的结果为

{ 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]);
    }
});
};

【问题讨论】:

  • 您应该通过回调将数据传回,而不是设置全局变量来捕获数据。
  • 另外,你不能只传递参数dbclient,然后期望回调突然成为第二个参数。
  • @adeneo 你能详细说明一下吗?谢谢

标签: javascript mysql node.js async.js


【解决方案1】:

如果您查看瀑布的文档,您会发现回调是按数组的顺序调用的,并且在处理完数组的所有元素后调用最终函数(err, results)。

https://github.com/caolan/async#waterfall

所以在你的第一个回调中

 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, expected result);

null 表示瀑布没有错误并继续。

您的结果变量也可能是字符串而不是数组。请检查一下。 因为如果它是一个字符串,这个测试就会通过(可能是你的问题。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-12
    • 2019-06-09
    • 2019-09-22
    • 2018-10-04
    • 2014-01-05
    • 2018-01-22
    相关资源
    最近更新 更多