2017-01-02 3 views
0

私は最近Promises(Bluebird)を学び始めましたが、できるだけそれらを使用しようとしていますが、私はこの場合に約束を返す必要がある場合はちょっと混乱します。約束を混乱させる。私はここに戻る必要がありますか?

ここで私は私が作ったパスポートLocalStrategyを持っている:

passport.use(new LocalStrategy(function(username, password, done) { 
    users.get(username) // A 
     .then(function(user) { 
      if (!user) { 
       return done(null, false, { message: 'Incorrect username.' }); 
      } 
      bcrypt.compare(password, user.password).then(function(result) { // B 
       if (result) { 
        return done(null, user); 
       } 
       return done(null, false, { message: 'Incorrect password.' }); 
      }); 
     }) 
     .catch(function(err) { 
      return done(err); 
     }); 
})); 

users.get(username)をラインAには、以下の場合に1をデータベースにし、falseに発見された場合、ユーザーに解決される約束を返すようにpg-promiseライブラリを使用していますユーザーが見つかりませんでした。

bcrypt.compare(ラインB)は、bcryptを使用して、パスワードとハッシュが一致するかどうかを確認します。それは真実か偽になるかを決める約束を返します。

コードは完璧に動作ラインAとBがそう

return users.get(username) // A 

return bcrypt.compare(password, user.password).then(function(result) { // B 

コードがでと約束を返さずに働くように返す必要がある場合、私は混乱しています。

Passport/Nodeは、return doneが表示されるまで待ちますか?これは、内部のすべてが非同期であっても、この関数が同期していることを意味しますか?通常、約束を返して.then()を使用しますが、LocalStrategyは.then()または.catch()を使用していないので、返品する必要はありませんか?どんな入力も大歓迎です。ありがとう。

+0

少なくとも関連:http://stackoverflow.com/questions/23920589/how-to-pass-a-third-argument-to-a- callback-using-bluebird-js-nodeify – Tomalak

+0

これは、約束を持つ混乱を説明する本当に良い記事であることがわかりました[私たちは約束に問題がある](https://pouchdb.com/2015/05/18/we-have- a-problem-with-promises.html) – ivn

+0

Tomalak、ivn:ありがとう、それらをチェックするつもりです。 – Nikokin

答えて

0

PassportはPromiseをサポートしていないため、コールバックでdoneを呼び出す必要があります。 return users.get(username)でも可能ですが、戻り値(約束)は決して使用されません。次のようなことができますそのチェーンの約束を忘れないでください:

users.get(username) 
    .then(function(user) { 
     if (!user) { 
      return done(null, false, { message: 'Incorrect username.' }); 
     } 
     return bcrypt.compare(password, user.password); 
    }) 
    .then(function(result) { // B 
     if (result) { 
      return done(null, user); 
     } 
     return done(null, false, { message: 'Incorrect password.' }); 
    }) 
    .catch(function(err) { 
     return done(err); 
    }); 
+0

ありがとうございました。私はパスポートが気にしないので、このケースではおそらく問題ではないと考えました。帰りに害があったのかどうか疑問に思っていたが、そうは思わなかった。 あなたの例のようにチェーン化されていない理由は、bcrypt.compareがユーザーを返さないため、trueまたはfalseを返すだけなので、.then()users.get(username)の後にユーザーを返すことができません。 – Nikokin

関連する問題