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

时间:2016-04-03 08:51:51

标签: node.js express asynchronous passport.js

我在我的应用上实施了付款功能,我的提供商要求AccountId(我系统中用户的身份)和Email。我注意到一些我无法用Passport.js解释的奇怪行为。首先,反序列化看起来像在docs中:

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的方法,但这对我来说似乎是个黑客攻击。

1 个答案:

答案 0 :(得分:2)

你的问题在这里:

AccountId: toString(req.user._id),

toString是一个对象的方法。在浏览器中,只需调用toString即表示您的意思是window.toString()并返回[object Window]。在Node中,由于全局窗口不存在,因此您获得[object Undefined]

认为你打算调用该函数的方式是这样的:

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