NodeJS/PassportJS[本地]-有没有办法自动更新req.user



早上好,

我目前正在使用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之后创建的。让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);
});

最新更新