0

私はまだノードプログラミングを学んでいます... Expressを使用してWebアプリを構築しており、他のコールバック内の他の関数からのネストされたコールバックに関して、イベントベースのノンブロッキングI/Oに頭を悩ませたいと思っています。

どこでもコールバックを使用することに関して、私が理解しようとしている問題の 1 つを次に示します。

ほとんどの場合、これを行うことはできません (crypo では、この方法で同期が機能するため、この例は問題ありません)。

user.reset_password_token = require('crypto').randomBytes(32).toString('hex');

上記の例が機能することを確認する前に、これを行う必要がありました。

User.findOne({ email: req.body.username }, function(err, user) {

  crypto.randomBytes(256, function(ex, buf) {
    if (ex) throw ex;
    user.reset_password_token = buf.toString('hex');
  });

  user.save(); // can I do this here?

  //will user.reset_password_token be set here??
  // Or do I need to put all this code into the randomBytes callback...
  //Can I continue programming the .findOne() callback here
    // with the expectation that
  //user.reset_password_token is set?
  //Or am I out of bounds...for the crypto callback to have been called reliably.
});

If I call user.save() after the randomBytes code (not inside it's callback) will the token always be set?

4

1 に答える 1

1
//will user.reset_password_token be set here?

いいえ。あなたが持っている例では、への呼び出しcryptoは非同期的に行われます。つまり、その呼び出しを終了させるために実行が停止せず、代わりにfindOneメソッド内でコードの実行を続行します。

User.findOne({ email: req.body.username }, function(err, user) {

  crypto.randomBytes(256, function(ex, buf) {
    if (ex) throw ex;
    user.reset_password_token = buf.toString('hex');

    // only within this scope will user.reset_password_token be
    // set as expected
    user.save();
  });

  // undefined since this code is called before the crypto call completes
  // (at least when you call crypto async like you have)
  console.log(user.reset_password_token);
});
于 2012-09-26T00:17:39.310 に答える