2016-04-03 129 views
3

我在我的應用程序上實現了付款功能,我的提供商需要AccountId(我的系統中的用戶標識)和Email。我注意到了一些我無法用Passport.js解釋的奇怪行爲。首先,反序列化看起來像文檔:Passport.js異步與同步反序列化

passport.deserializeUser(function(id, done) { 
    User.findById(id, function(err, user) { 
    done(err, user); 
    }); 
}); 

現在,我得到的,這是一個異步操作,但是當我形成請求的數據,我做的:

var data = { 
    AccountId: toString(req.user._id), 
    Email: req.user.auth.local.email 
    // ... 
} 

對於一些原因Email設置正確,但AccountId總是返回[object Undefined]。那麼,我認爲這可能是由於Passport的反序列化的異步性質(因爲它需要時間到User.findById()),但爲什麼Email被正確設置呢?

我發現了一種將AccountId設置爲req.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()'是異步的。在中間件調用'done'函數之前,Express並沒有開始運行你的路由處理代碼,你在_after_ User.findById()'返回的回調函數中。 –