Passport.js 异步与同步反序列化
Posted
技术标签:
【中文标题】Passport.js 异步与同步反序列化【英文标题】:Passport.js async vs sync deserialization 【发布时间】:2016-07-22 20:36:08 【问题描述】:我正在我的应用程序上实现支付功能,我的提供商需要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。
【问题讨论】:
【参考方案1】:你的问题在这里:
AccountId: toString(req.user._id),
toString 是一个对象的方法。在浏览器中,简单地调用 toString 假定你的意思是window.toString()
,它返回[object Window]
。在 Node 中,由于全局窗口不存在,所以得到[object Undefined]
。
我认为你打算调用该函数的方式是这样的:
AccountId: req.user._id.toString(),
【讨论】:
非常感谢,这确实是我的本意! 我还是不明白User.findById()
的情况,它应该是异步的。这是否意味着 Node 等待它被解析并在下一个循环中处理代码?
@AntonEgorov 你是对的,User.findById()
是异步的。 Express 直到中间件调用了 done
函数之后才开始运行您的路由处理代码,您在 User.findById()
在回调中返回之后执行此操作。以上是关于Passport.js 异步与同步反序列化的主要内容,如果未能解决你的问题,请参考以下文章
Passport-local mongoose node.js 支持多种用户类型