Mongoose模型验证失败求助:Todo应用提交数据触发必填项报错
解决Mongoose Todo模型验证失败问题
核心问题分析
你遇到的description必填验证失败,本质是Express未正确解析JSON请求体,导致req.body.description为undefined,触发了Mongoose的必填校验规则。
具体修复步骤
1. 启用Express的JSON解析中间件
在你的Express主入口文件(如app.js或server.js)中,添加JSON请求体解析配置,这是解决问题的关键:
const express = require('express'); const app = express(); // 必须添加此行,解析JSON格式的请求体 app.use(express.json()); // 挂载你的Todo路由 app.use(require('./routes/your-todo-router-file'));
若缺少这行中间件,req.body会始终是undefined,创建Todo时description字段自然缺失,触发验证错误。
2. 规范Timestamp字段的默认值(可选优化)
你的模型中timestamp的default使用了Date.now(),这会在模型定义时就生成固定时间,而非创建Todo文档时的实时时间。建议修改为不带括号的Date.now,让Mongoose在创建文档时自动调用:
timestamp: { type: Date, required: true, default: Date.now, // 去掉括号,改为引用函数而非立即执行 },
3. 验证请求体是否正常接收
可在路由中临时添加日志,确认req.body是否被正确解析:
router.post("/new", async (req, res) => { console.log(req.body); // 打印请求体,确认是否包含description字段 const todo = new Todo({ description: req.body.description }); try { const newTodo = await todo.save(); res.status(201).json(newTodo); } catch (error) { res.status(400).json({ message: error.message }); } });
如果打印结果为undefined,说明问题确实出在JSON解析环节,回到第一步补全中间件配置即可。
测试验证
重启服务器后,重新发送之前的POST请求,即可正常创建Todo,不再触发验证错误。
内容的提问来源于stack exchange,提问作者Eddy
相关产品推荐
相关产品推荐

