2012-12-12 111 views
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”。mongoose express node.js javascript函数返回undefined

感谢任何人都可以向我解释。谢谢!

回答

2

这是因为“打印2”发生在回调内部。当findOne完成它然后触发回调函数。

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

+0

谢谢!我想我明白你的意思。 –

+0

Np。如果我回答了您的问题,请不要忘记给我绿色的复选标记;) – Chev

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;博士 只要按照嵌套的回调和我不会有事的。一般认为,在异步不方式同步 :)

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