Node JS / Passport JS [local] - 有没有办法自动更新 req.user?

NodeJS / PassportJS [local] - Is there a way to update req.user automatically?

早上好,

我目前正在使用 NodeJS、Passport、MongoDB (+Mongoose) 在线学习初级课程并实施注册、登录、更改详细信息等

在实现允许用户更改姓名、电子邮件地址和个人资料图片的编辑个人资料页面时,我注意到我的 req.user 没有得到更新,而我正在观看的课程说 Passport 应该处理它自动的,他的视频显然也是如此。

我输入的更改已成功反映在 MongoDB 中,我可以通过在 mongo 中键入 db.users.find({}) 看到这一点,但我的 req.user 对象没有'由于没有更新,所以我的页面仍然呈现旧名称、电子邮件和个人资料图片直到我注销并重新登录。

我已经按照下面的代码手动更新 req.user 来解决这个问题,但我想知道为什么我的代码与我正在观看的视频的行为不同。任何指导将不胜感激。

//from the controller
export const postEditProfile = async (req, res) => {
  const {
    body: { name, email },
    file,
  } = req;
  try {
    await User.findByIdAndUpdate(req.user._id, {
      name,
      email,
      avatarUrl: file ? file.path : req.user.avatarUrl,
    });
    console.log(req.user);  //shows old db information
    req.user.name = name;
    req.user.email = email;
    req.user.avatarUrl = file ? file.path : req.user.avatarUrl;
    res.redirect(routes.me);
    console.log(req.user); //shows new db information
  } catch (error) {
    res.render("editProfile", { pageTitle: "Edit Profile" });
  }
};
//serializing and deserialzing
passport.serializeUser((user, done) => {
  done(null, user);
});

passport.deserializeUser((obj, done) => {
  done(null, obj);
});

谢谢!

req.user 对象是在 deserializeUser 调用 done 后创建的。 deserializeUser 进行数据库查询是一种常见的做法,如果在初始登录后进行了更改,该数据库查询又会更新 req.user。

下面是一个使用 sequelize 的例子。您可能需要修改代码以使用您的数据库查询系统。不过,一般的想法是 deserializeUser 在每个请求上调用,因此通过查询数据库,您可以维护最新数据。

passport.deserializeUser((obj, done) => {
  try {
    const { userId } = obj;
    const { dataValues: user } = await User.findOne({ where: { userId } }) || {};
    if (!user) done(null, false); // no user found
    done(null, user);
  } catch (err) {
    done(err);
  });