Passport.js异步与同步反序列化

4

我正在我的应用程序上实现支付功能,我的提供商需要 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个回答

3
你的问题在这里:
AccountId: toString(req.user._id),

toString是一个对象的方法。在浏览器中,简单地调用toString会默认你指的是window.toString(),并返回[object Window]。在Node中,由于全局窗口不存在,你会得到[object Undefined]

我认为你想调用那个函数的方式应该是这样的:

 AccountId: req.user._id.toString(),

非常感谢,这确实是我想要使用的方式! - Anton Egorov
我仍然不理解User.findById()的情况,它应该是异步的。这是否意味着Node等待它被解决并在下一个循环中处理代码? - Anton Egorov
1
@AntonEgorov 你是正确的,User.findById() 是异步的。Express 在中间件调用 done 函数之后才开始运行路由处理代码,在回调函数中你在 User.findById() 返回后调用了它。 - Chris Foster

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接