Passport.js 异步与同步反序列化
Passport.js async vs sync deserialization
我正在我的应用程序上实现支付功能,我的提供商需要 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
总是 returns [object Undefined]
。好吧,我认为这可能是由于 Passport 反序列化的异步性质(因为它需要时间 User.findById()
),但为什么 Email
会被正确设置?
我找到了一种将 AccountId
设置为 req.session.passport.user
的方法,但对我来说这似乎是一个 hack。
您的问题在这里:
AccountId: toString(req.user._id),
toString是一个对象的方法。在浏览器中,简单地调用 toString 假设你的意思是 window.toString()
而它是 returns [object Window]
。在 Node 中,由于全局 window 不存在,你得到 [object Undefined]
.
我认为您调用该函数的方式应该是这样的:
AccountId: req.user._id.toString(),
我正在我的应用程序上实现支付功能,我的提供商需要 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
总是 returns [object Undefined]
。好吧,我认为这可能是由于 Passport 反序列化的异步性质(因为它需要时间 User.findById()
),但为什么 Email
会被正确设置?
我找到了一种将 AccountId
设置为 req.session.passport.user
的方法,但对我来说这似乎是一个 hack。
您的问题在这里:
AccountId: toString(req.user._id),
toString是一个对象的方法。在浏览器中,简单地调用 toString 假设你的意思是 window.toString()
而它是 returns [object Window]
。在 Node 中,由于全局 window 不存在,你得到 [object Undefined]
.
我认为您调用该函数的方式应该是这样的:
AccountId: req.user._id.toString(),