【问题标题】:Node.js mongodb trouble with callbacksNode.js mongodb 回调问题
【发布时间】:2016-01-29 20:08:56
【问题描述】:

所以我正在尝试创建一个注册路由来检查用户是否首先存在,并且我在需要返回 true 的单独函数中调用了数据库>false 完成后。问题是我对回调不是很熟悉,而且我搜索的所有东西似乎都不起作用的整个异步事情一直给我。

TypeError: callback is not a function

这是我的代码,任何帮助或指导将不胜感激。

function pullUserFromDatabase(username, callback) {



console.log(username); //for debug
    mongodb.connect(url, function(err, db) {
        if(err) {
                console.log("didn't get far" + err) //for debug

            }

        var collection = db.collection(username);

        collection.findOne({username}, function(err, item) {
            if(err) {
                console.log("nope it broke" + err) //for debug

            } else {
                console.log("it worked" + JSON.stringify(item)) //for debug
                callback(true);
            }
        });




});

}

app.post("/signup", function(req, res) {
    var username = req.headers["username"],
        password = req.headers["password"],
        randomSalt = crypto.randomBytes(32).toString("hex"),
        passwordHashOutput = crypto.createHash('sha256').update(password + randomSalt).digest("hex");

        if(!username || !password) {
            res.send("Username or password not provided.")
        } else if(pullUserFromDatabase(username)) {
            res.send("User exist.")
        }
});

【问题讨论】:

    标签: javascript node.js mongodb asynchronous callback


    【解决方案1】:

    你需要按如下方式使用回调:

    function pullUserFromDatabase(data, callback) { 
        console.log(data.username); //for debug
        mongodb.connect(url, function(err, db) {
            if(err) {
                console.log("didn't get far" + err) //for debug
            }
    
            var collection = db.collection(data.collection);
            collection.find({"username": data.username}).count(function (err, count) {
                callback(err, !! count);
            });
        });
    };
    
    
    
    
    app.post("/signup", function(req, res) {
        var username = req.headers["username"],
            password = req.headers["password"],
            randomSalt = crypto.randomBytes(32).toString("hex"),
            passwordHashOutput = crypto.createHash('sha256').update(password + randomSalt).digest("hex");
    
            if(!username || !password) {
                res.send("Username or password not provided.")
            } 
    
            var data = {
                username: username,
                collection: "collectionName"            
            }
    
            if(!username || !password) {
                res.send("Username or password not provided.")
            }
    
            pullUserFromDatabase(data, function(err, exists) {
                if (err) {
                    res.send(400, "Error - " + err);
                }
                else if(exists) {
                    res.send(200, "User exists.");
                }
                res.send(200, "User does not exist.");
            });
    });
    

    【讨论】:

    • 谢谢。你真的为我清理了它,但我的问题是如何将整个事情包装到原始函数中,这样如果你做一个 else 如果你只关心被调用的函数是返回 true 还是 false 或者这不是一个好习惯?或者这是正确的做法吗?
    • 您需要在函数回调中执行 if-else 逻辑,因为用于存储现有用户信息的变量将来自要调用的函数的结果。这是一般模式;在函数回调中做逻辑。
    • 我明白了。所以假设我想做一些更高级的事情。就像一个 var 函数数组,比如你如何设置 var data 但使用函数,所以 data.pullPosts 本质上的设置方式与你所做的 pullUserFromDatabase(data, function(err, exists). Documentation(mongos is wrong), google and stackover flow 只能带您到此为止,但是当您想要制作非常复杂的东西时,那里缺少。
    • 我也很好奇不计数是什么,因为我知道如果计数存在则返回 1,如果不正确则返回 0?那是什么!!为了?
    • 把你的最后一个问题作为第一个问题来回答有点宽泛,需要你打开一个新问题;根据文档, cursor.count() 方法的回调的第二个参数将包含结果的数量,如果发生错误,则为 null。对于这个例子,作为一个简单的测试var count = 2; console.log(!! count); // prints true while var count = 0; console.log(!! count); // prints false
    【解决方案2】:

    callback 未定义的原因是因为您没有将第二个参数传递给pullUserFromDatabase(username) 提供第二个参数,例如。 pullUserFromDatabase(username, function(result) {/* do something here with the result variable */})

    如果您对 aync 和回调不是很熟悉,您可能会发现使用 promises 更直观,但它有自己的学习曲线。

    在原始代码的上下文中,这看起来像:

        ...
        if(!username || !password) {
            res.send("Username or password not provided.");
            return;
        } 
    
        pullUserFromDatabase(username, function(result) {
            if(result) {
               res.send("User exist.");
            } else { 
               // TODO: Handle this case.  If res.send() is never called, the HTTP request won't complete
            }
        });
        ...
    

    此外,您需要确保始终调用您的回调。添加回调(false):

       console.log("nope it broke" + err); //for debug
       callback(false);
    

    "didn't get far"return 之后执行类似的步骤,这样回调就不会被多次调用。

    【讨论】:

    • 仍然得到 TypeError: callback is not a function
    • 我认为你错过了我想要做的事情 else if 只能是真或假,而 pullUserFromDatabase() 我试图让嵌套函数 collection.findOne 返回一个值它是主要的父函数 pullUserFromDatabase()
    猜你喜欢
    • 2015-11-01
    • 2023-03-03
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 2013-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多