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

标签 node.js express asynchronous passport.js

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

最佳答案

你的问题在这里:

AccountId: toString(req.user._id),

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

认为您调用该函数的方式应该是这样的:

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

关于node.js - Passport.js 异步与同步反序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36383404/

相关文章:

mysql - Nodejs 和 MySQL,如何在 MySQL INSERT 语句中使用 NodeJs 变量

php - NodeJS 比 PHP 慢很多?

javascript - 是什么让 Express-Session 决定开始新的 session ?

Kotlin:有没有工具可以让我在执行挂起函数时控制并行度?

asynchronous - 等待线程池中启动的异步工作流程

javascript - 如何添加回调以在 JQuery 每个选择器之后发生?

javascript - node.js csurf 无效的 csrf token

javascript - 评估失败 : TypeError: Cannot read properties of null (reading 'firstElementChild' )

javascript - JS 错误为 : var is not defined. 我如何发送函数值

node.js - Expressjs 未在 heroku 上加载样式表,出现 500 错误