【问题标题】:NodeJS / PassportJS [local] - Is there a way to update req.user automatically?NodeJS / PassportJS [本地] - 有没有办法自动更新 req.user?
【发布时间】:2020-10-14 00:00:01
【问题描述】:

早上好,

我目前正在使用 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);
});

谢谢!

【问题讨论】:

    标签: node.js mongodb passport.js


    【解决方案1】:

    req.user 对象是在调用deserializeUser 之后创建的。让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);
      });
    

    【讨论】:

    • 非常感谢你是个传奇!
    • 不客气!如果我的回答有帮助,您能否将其标记为已接受?
    • 您好,我还没有尝试您的解决方案!我能在几天内告诉你吗?我按原样学习课程,然后想做一个分支,所以我不会搞砸任何事情!
    猜你喜欢
    • 1970-01-01
    • 2020-12-11
    • 2019-07-01
    • 2013-06-06
    • 2012-10-16
    • 1970-01-01
    • 2013-04-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多