【问题标题】:NodeJS Callback not a function Async waterfallNodeJS回调不是函数异步瀑布
【发布时间】:2017-04-26 18:45:23
【问题描述】:

我一直在编写一个简单的服务器,并且遇到了一个问题,即我得到一个未定义的回调错误,尽管我的函数头中有一个回调参数。我在 Google 上看到的每个示例都是没有回调参数的人,但我似乎有一个?抛出的错误是 TypeError: callback is not a function。

代码:

app.post("/api/info/", function(req, res){
    async.waterfall([
        function(callback){
            debugger;
            jwt.verify(req.body.jwt, secret.secret, {ignoreExpiration: false}, 
            function(err, decoded){
                console.log(err);
                console.log(decoded.uuid);
                debugger;
                if(err) {
                    debugger;
                    console.log("error1: " + err);
                    debugger;
                    res.json({
                        status: 403
                    });
                    res.end();
                    callback("JWT auth failed", null);
                    return;
                }
                debugger;
                callback(null, decoded.uuid);
            });
        },
        function(err, token, callback){ //query db for user uuid


       debugger;
        pool.query("SELECT * FROM users WHERE INSTR (uuid," + "'" + token + "') > 0", function(err, rows){
            if(err) console.log(err);
            debugger;
            callback(rows); //where it errors
        });
    },
    function(rows, callback){ //get user's school name
    debugger;
        var schoolId = rows[0].chapter_uuid;
        pool.query("SELECT * FROM chapters WHERE INSTR (uuid," + "'" + schoolId + "') > 0", function(err, result){
            debugger;
            callback(rows, result[0].school);
        });
    }, 
    function(rows, chapter, callback){ //return db results to user in json
        debugger;
        var canMakeEvent = 0;
        if(rows[0].is_board){
            canMakeEvent = 1;
        }
        var info = {
            firstName: rows[0].first_name,
            lastName: rows[0].last_name,
            email: rows[0].email,
            chapter: chapter,
            isBoard: canMakeEvent,
            boardPosition: rows[0].board_position
        };
        res.json({
            status: 200,
            info: info
        });
        res.end();
        debugger;
        callback(null);
    }
], function(err){console.log(err);});
});

【问题讨论】:

  • 好的,在哪里你得到错误了吗?
  • 代码中有一条注释,就在“SELECT * FROM users WHERE INSTR”的正下方。异步函数的标头是 function(err, token, callback)。抱歉,如果代码难以阅读,stackoverflow 搞砸了制表符/间距。
  • 谢谢。我忽略了这一点。这个问题对我来说还不明显。您是否看过回调是什么,是否已定义?一切(例如 JWT 验证)是否按预期工作?我问,因为调用res.end(); 后跟 callback("JWT auth failed",... 让我觉得很不寻常,但也许不一定不正确。
  • 控制台记录 JWT 的正文会返回 JWT 中应该包含的内容。回调应该被定义,但是控制台记录它给出了未定义的,即使回调是在错误的函数的方法头中。我看不出回调怎么可能不存在。

标签: javascript mysql node.js async.js


【解决方案1】:
   function(err, token, callback){ //query db for user uuid


   debugger;
    pool.query("SELECT * FROM users WHERE INSTR (uuid," + "'" + token + "')  > 0", function(err, rows){
        if(err) console.log(err);
        debugger;
        callback(null,rows); //where it errors
    });
},

pool.query 中的内部函数有两个参数:errrows。所以在返回的callback 中,它需要2 个参数。由于第一个参数是err,在callback 中使用null,因为它只需要调用if(!err) 条件。

【讨论】:

    猜你喜欢
    • 2017-08-03
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-09
    • 2017-03-02
    • 1970-01-01
    相关资源
    最近更新 更多