26

我正在将 PassportJS 与 ExpressJS 一起使用。

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

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

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

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

4

3 回答 3

39

我也一直在寻找这个问题的答案。从未在任何文档或教程中提及!

似乎可行的是,在保存新更新的用户后,执行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)
    })
})

线索就在这里...... https://github.com/jaredhanson/passport/issues/208

于 2014-06-30T20:46:55.990 回答
0

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

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

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);
  });
于 2020-11-06T08:17:47.353 回答
0
User.findById(req.user._id,function(err,doc){
        req.logIn(doc,function(err1){

                if(err1){ console.log("Error : "+err1) }
                              else{
                                    res.render("abc.ejs",{user:req.user});
                                    console.log('Item Removed Successfully!!!');
                              }

                        });
                  });

这里我们重新登录用户
User => Mongoose Model

于 2020-06-02T05:26:40.343 回答