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 支持多种用户类型

Express + Passport.js:req.user 未定义

Java序列化与反序列化

Java序列化与反序列化

Java序列化与反序列化