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からパスワードが返されます。ただし、デバッグするたびに、「print1」は常に「print2」の前に出力され、このメソッドを呼び出して変数に格納するapp.post関数は常に「undefined」を返すことに気付きました。

誰かが私に説明できるかどうか感謝します。ありがとう!

4

2 に答える 2

2

これは、「print2」がコールバック内で発生するためです。findOneが終了すると、コールバック関数を起動します。

基本的に、ノードのメインイベントループが発生User.findOneし、すぐに「print1」に移動します。次に、少し後にfindOne終了して、指定したコールバック関数を起動します。これにより、「print2」が起動します。

于 2012-12-12T07:06:37.300 に答える
0

@アレックスフォードは正しいです。Node.jsには、ブロッキングアプローチがあってはなりません。代わりに、ほとんどすべてにコールバックを使用してください:)

したがって、ヘルパーには、ジョブの完了後に呼び出されるgetPassword()もう1つの引数が必要です。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; drネストされたコールバックに従うだけで、問題ありません。一般的に、同期しない方法で非同期で考えてください:)

上記のコードはテストされていないので、最初にテストしてください;)

于 2012-12-12T16:07:00.043 に答える