2012-12-12 108 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;博士 只要按照嵌套的回調和我不會有事的。一般認爲,在異步不方式同步 :)

上面的代碼沒有經過測試,所以請首先測試它;)