You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:52:11