【问题标题】:Passport.js async vs sync deserializationPassport.js 异步与同步反序列化
【发布时间】: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。

【问题讨论】:

    标签: node.js express asynchronous passport.js


    【解决方案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() 在回调中返回之后执行此操作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-23
    • 2012-11-03
    相关资源
    最近更新 更多