Node.js mongodb遇到回调问题

时间:2015-10-29 15:29:03

标签: javascript node.js mongodb asynchronous callback

所以我正在尝试创建一个注册路由,检查用户是否存在,并且我在一个需要返回 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.")
        }
});

2 个答案:

答案 0 :(得分: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.");
        });
});

答案 1 :(得分:0)

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

如果你不熟悉aync& amp;回调,您可能会发现使用 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,这样就不会多次调用回调。