MongoDB更新用户数据运行报错,正确的用户信息修改实现方法是什么?
现有代码错误点
- 语法错误:渲染编辑页的路由末尾多了冗余的
});,直接导致代码无法正常编译运行 - 模型调用错误:查询用户数据错误使用了
Post模型,应该使用对应存储用户集合的User模型 - 变量引用错误:POST逻辑中查询到的用户文档赋值给了
user变量,后续修改字段时调用了未定义的post变量,运行时会直接抛出引用异常 - 路由拼接错误:更新成功后的重定向路径缺少分隔斜杠,拼接后会生成
/interfacexxx这类不符合预期的路径 - 安全缺陷:用户密码直接明文存入数据库,存在数据泄露风险,建议加密后再存储
修正后完整实现
1. 渲染用户编辑页路由
// 注意根据你的实际路由前缀调整路径,查询用户使用User模型 router.get('/edituser/:userId', function(err, user) { User.findById(req.params.userId).exec(function(err, user) { res.render("home/edituser", { user: user }); }); });
2. 保存用户更新路由
router.post("/save" ,async function(req,res){ try { // 先查询对应用户 const user = await User.findById(req.body.userId); if (!user) { req.flash("error","用户不存在"); return res.redirect("/edituser"); } // 赋值字段,变量名和查询出的文档对象保持一致 user.username = req.body.username; user.email = req.body.email; // 注意:生产环境请先对req.body.password做bcrypt加密再赋值 user.password = req.body.password; // 保存更新 const saveUser = await user.save(); console.log("saveuser", saveUser); // 路径拼接添加斜杠,使用模板字符串写法更清晰 res.redirect(`/interface/${req.body.userId}`); } catch(err) { req.flash("error","用户更新失败"); return res.redirect("/edituser"); } });
简化实现参考
你也可以直接使用findByIdAndUpdate方法省去先查询再赋值的步骤,代码更简洁:
router.post("/save" ,async function(req,res){ try { // 配置new: true返回更新后的数据,runValidators: true触发模型字段校验 const updateUser = await User.findByIdAndUpdate( req.body.userId, { username: req.body.username, email: req.body.email, // 密码同上先做加密处理 password: req.body.password }, { new: true, runValidators: true } ); if (!updateUser) { req.flash("error","用户不存在"); return res.redirect("/edituser"); } res.redirect(`/interface/${req.body.userId}`); } catch(err) { req.flash("error","用户更新失败"); return res.redirect("/edituser"); } });
内容的提问来源于stack exchange,提问作者senyonjo
相关产品推荐
相关产品推荐

