2016-04-03 9 views
3

私は自分のアプリで支払い機能を実装しており、プロバイダの請求書は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が正しく設定されるのでしょうか?

私はAccountIdreq.session.passport.userに設定する方法を見つけましたが、それは私にとってハックのようです。

答えて

2

あなたの問題はここにある:

AccountId: toString(req.user._id), 

のtoStringは、オブジェクトのメソッドです。ブラウザでは、単にtoStringを呼び出すと、window.toString()を意味し、それは[object Window]を返します。ノードでは、グローバルウィンドウが存在しないため、[object Undefined]となります。

私はあなたがその機能を呼び出すためのもの道はそうのようなものだと思う

AccountId: req.user._id.toString(), 
+0

どうもありがとう、それは確かに私はそれを使用するためのものの方法です! –

+0

まだ私は 'User.findById()'で状況を取得しません、それは非同期でなければなりません。それはNodeが解決を待って次のループでコードを処理するということですか? –

+1

@AntonEgorovあなたが正しいです、 'User.findById()'は非同期です。 Expressは、ミドルウェアが 'done'関数を呼び出すまでルート処理コードの実行を開始しません。これは、' User.findById() 'がコールバックで返された後です。 –

関連する問題