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

使用Mongoose Schema无法更新模型问题求助

解决Mongoose模型无法更新的问题

核心问题分析

你的代码存在两个关键错误:findOneAndUpdate参数顺序错误,以及PUT请求的处理不符合HTML表单的原生限制,导致数据无法正常更新。

分步修复

1. 修正POST路由的更新逻辑

findOneAndUpdate的参数顺序应为查询条件 → 更新数据 → 配置选项,你之前将更新数据与选项位置颠倒,导致Mongoose无法正确识别更新内容。使用findByIdAndUpdate会更简洁(因通过ID查询):

router.post('/edit/:id', async (req, res) => {
  try {
    await Warum.findByIdAndUpdate(req.params.id, {
      title: req.body.title,
      description: req.body.description
    }, { new: true }); // new:true 可选,返回更新后的文档
    res.redirect('/warum');
  } catch (err) {
    console.log('更新失败:', err);
    res.status(500).send('更新出错');
  }
});

2. 解决PUT请求的404问题

HTML表单原生仅支持GET/POST,要使用PUT需借助method-override中间件:

  • 安装依赖:npm install method-override
  • 在Express主文件中配置中间件:
    const methodOverride = require('method-override');
    app.use(methodOverride('_method'));
    
  • 修改表单,添加隐藏字段指定请求方法:
    <form method="post">
      <input type="hidden" name="_method" value="PUT">
      <h2>Beitrag bearbeiten</h2>
      <!-- 其余表单内容不变 -->
    </form>
    
  • 调整路由为PUT类型:
    router.put('/edit/:id', async (req, res) => {
      try {
        await Warum.findByIdAndUpdate(req.params.id, {
          title: req.body.title,
          description: req.body.description
        });
        res.redirect('/warum');
      } catch (err) {
        console.log('更新失败:', err);
        res.status(500).send('更新出错');
      }
    });
    

3. 修复textarea的内容渲染问题

原表单中textarea的内容存在多余换行和缩进,会导致提交的description包含无效空白字符,修正为:

<textarea class="texterea" name="description">{{description}}</textarea>

4. 验证数据接收(可选)

在路由中打印req.body,确认是否正确获取表单提交的数据:

router.post('/edit/:id', (req, res) => {
  console.log('提交的数据:', req.body); // 检查title和description是否存在
  // 后续更新逻辑
});

内容的提问来源于stack exchange,提问作者DragoO

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 14:45:27