使用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
相关产品推荐
相关产品推荐

