MongoDB中无法将用户数据更新至对应属性的问题排查
解决MongoDB用户属性更新失败的问题
看起来你遇到的核心问题有两个:请求体的数据结构不匹配,以及**findByIdAndUpdate的默认行为导致你看到的是旧数据**。咱们一步步来修复:
1. 修正路由中的请求体引用
你的表单提交的是顶级的isFavUser字段,所以req.body的结构是{ isFavUser: 'true' },但你的路由里用了req.body.user——这会导致MongoDB接收到的更新对象是undefined,自然不会修改任何数据。
把路由里的更新参数改成req.body即可:
router.put("/snake/admin/users/:id", function(req, res){ // 将 req.body.user 替换为 req.body User.findByIdAndUpdate(req.params.id, req.body, function(err, updatedUser){ if (err){ console.log(err); res.render("error"); }else{ res.render("admin/profile", {users: updatedUser}); console.log(req.body); console.log(updatedUser); } }); });
2. 让findByIdAndUpdate返回更新后的文档
默认情况下,findByIdAndUpdate会返回更新之前的用户文档,所以你控制台打印的updatedUser其实是旧数据,即使数据库已经更新了,你也看不到变化。
需要添加{ new: true }选项来获取更新后的结果:
router.put("/snake/admin/users/:id", function(req, res){ // 新增 { new: true } 作为第三个参数 User.findByIdAndUpdate(req.params.id, req.body, { new: true }, function(err, updatedUser){ if (err){ console.log(err); res.render("error"); }else{ res.render("admin/profile", {users: updatedUser}); console.log(req.body); console.log(updatedUser); // 现在这里会显示更新后的文档 } }); });
3. 优化表单的select选项(可选但推荐)
你的第一个select选项没有设置value属性,用户如果直接提交这个选项会发送空值。可以给它加上与当前用户状态匹配的value,提升交互体验:
<select name="isFavUser"> <!-- 给默认选项添加对应value,与用户当前的isFavUser值一致 --> <option value="<%= users.isFavUser %>">Current: <%= users.isFavUser %></option> <option value="true">True</option> <option value="false">False</option> </select>
做完这几步再测试,MongoDB里的isFavUser应该会正确更新,控制台打印的updatedUser也会显示最新的值了。
内容的提问来源于stack exchange,提问作者samhughlett
相关产品推荐
相关产品推荐

