我正在我的应用程序上实现支付功能,我的提供商需要 AccountId
(用户在我的系统中的身份)和 Email
。我注意到了一些奇怪的行为,我无法用 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
,但对我来说似乎是一个 hack。
User.findById()
的情况,它应该是异步的。这是否意味着Node等待它被解决并在下一个循环中处理代码? - Anton EgorovUser.findById()
是异步的。Express 在中间件调用done
函数之后才开始运行路由处理代码,在回调函数中你在User.findById()
返回后调用了它。 - Chris Foster