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(),