Node.js 更新会话中登录的用户详细信息

Node.js 更新会话中登录的用户详细信息,node.js,express,passport.js,passport-local,Node.js,Express,Passport.js,Passport Local,我将PassportJS与ExpressJS一起使用 我需要更新登录的用户详细信息。虽然我在DB中更新了它,但如何在会话中也更新它,以便request.user包含更新的用户详细信息 也就是说,在更新数据库之后,如何更新用户的会话信息 我尝试直接将更新的详细信息分配给请求。user,但没有成功。 然后,我尝试了request.session.passport.user——这是有效的,但在request.user中更新之前会有大约5到10秒的延迟 是否需要调用一个函数来更新会话中存储的用户信息?或

我将PassportJS与ExpressJS一起使用

我需要更新登录的用户详细信息。虽然我在DB中更新了它,但如何在会话中也更新它,以便request.user包含更新的用户详细信息

也就是说,在更新数据库之后,如何更新用户的会话信息

我尝试直接将更新的详细信息分配给
请求。user
,但没有成功。 然后,我尝试了
request.session.passport.user
——这是有效的,但在request.user中更新之前会有大约5到10秒的延迟


是否需要调用一个函数来更新会话中存储的用户信息?或者我可以在更改没有延迟的情况下更新其他对象

我也一直在寻找答案。从未在任何文档或教程中提及

似乎有效的方法是,在保存新更新的用户后,执行
req.login(user)

// "user" is the user with newly updated info
user.save(function(err) {
    if (err) return next(err)
    // What's happening in passport's session? Check a specific field...
    console.log("Before relogin: "+req.session.passport.user.changedField)

    req.login(user, function(err) {
        if (err) return next(err)

        console.log("After relogin: "+req.session.passport.user.changedField)
        res.send(200)
    })
})
线索就在这里

在这里,我们重新登录用户

User=>Mongoose Model

我今天遇到了类似的问题,决定分享我的发现,因为我找不到类似的答案

问题是(从passport文档复制)我直接从用户在请求中发送的令牌获取用户数据。这当然已经过时了

passport.use(new JWTStrategy({
    jwtFromRequest: ExtractJWT.fromAuthHeaderAsBearerToken(),
    secretOrKey   : CONFIG.JWT_SECRET
  },
  function (jwtPayload, cb) {
    return cb(null, jwtPayload);
  }
));
而我应该从数据库中获取新的用户对象:

return User.findById(jwtPayload.id)
  .then(user => {
    return cb(null, user);
  })
  .catch(err => {
    return cb(err);
  });

谢谢你指出这一点。这似乎是更新会话数据的正确方法,因为
login
调用passport序列化程序函数来更新会话中存储的用户数据。然而,由于某种原因,我在更新会话时遇到了延迟,因此我的应用程序中的
res.send(200)
等效代码被放置在一个2秒的
setTimeout
函数中,这很有帮助。非常奇怪。那么,如果您像我的示例中那样做了两个控制台日志,那么第二个日志仍然显示旧数据?您可能认为,当req.login回调发生时,每个异步更改都已经执行了。好吧,如果每次等待2秒就能解决问题,那你就很好了。
return User.findById(jwtPayload.id)
  .then(user => {
    return cb(null, user);
  })
  .catch(err => {
    return cb(err);
  });