3
function getPassword(uname)
{

    User.findOne({'username': uname},{'password': 1}, function(err, cb)
    {
        console.log("print 2");
        return cb.password;
    });
    console.log("print 1");
}

我是 node.js 的新手。目前,我有这个函数,调用时应该从 mongodb 返回密码。但是,每当我调试时,我意识到“print 1”总是在“print 2”之前打印,并且调用此方法并存储到变量的 app.post 函数总是返回“undefined”。

感谢是否有人可以向我解释。谢谢!

4

2 回答 2

2

那是因为“print 2”发生在回调内部。当 findOne 完成时,它会触发回调函数。

基本上节点中的主事件循环触发User.findOne,然后立即移动到“打印1”。然后稍后findOne完成并触发您提供的回调函数,然后触发“print 2”。

于 2012-12-12T07:06:37.300 回答
0

@Alex Ford 是对的。在 Node.js 中不应该有阻塞的方法。相反,大多数情况下都使用回调:)

所以你的getPassword()助手只需要一个参数callback [Function],它将在工作完成后调用。

function getPassword(uname, cb) {
  User.findOne({'username': uname}, {'password': 1}, cb(err, data));
}

app.post('/somewhere', function (req, res, next) {
  // ...
  getPassword(username, function (err, password) {
    if (err) return next(err);
    console.log("I got '%s' password!", password);
  });
});

tl;博士只需遵循嵌套回调就可以了。一般来说,以异步方式思考不同步:)

上面的代码没有经过测试,所以请先测试它;)

于 2012-12-12T16:07:00.043 回答