私は自分のアプリで支払い機能を実装しており、プロバイダの請求書はAccountId
(私のシステムではユーザーの身元確認)とEmail
です。私はPassport.jsで説明できないいくつかの奇妙な動作に気付きました。まず第一に、直列化復元は、ドキュメント内のようになります。いくつかの場合Passport.js非同期vs同期の逆シリアル化
var data = {
AccountId: toString(req.user._id),
Email: req.user.auth.local.email
// ...
}
を:今
passport.deserializeUser(function(id, done) {
User.findById(id, function(err, user) {
done(err, user);
});
});
、私は私がリクエストのためのデータを形成する場合しかし、私は、これは非同期操作であることを取得します理由Email
は正しく設定されますが、AccountId
は常に[object Undefined]
を返します。さて、Passportの非直列化の非同期性の理由は、User.findById()
に時間がかかるためですが、なぜEmail
が正しく設定されるのでしょうか?
私はAccountId
をreq.session.passport.user
に設定する方法を見つけましたが、それは私にとってハックのようです。
どうもありがとう、それは確かに私はそれを使用するためのものの方法です! –
まだ私は 'User.findById()'で状況を取得しません、それは非同期でなければなりません。それはNodeが解決を待って次のループでコードを処理するということですか? –
@AntonEgorovあなたが正しいです、 'User.findById()'は非同期です。 Expressは、ミドルウェアが 'done'関数を呼び出すまでルート処理コードの実行を開始しません。これは、' User.findById() 'がコールバックで返された後です。 –