Visual Studio Code中使用MongoDB出现Product模型验证错误求助
报错根本原因
Mongoose的Schema校验规则触发,你在Product模型里给username和email设置了required: true的必填规则,当执行Product.create(req.body)时,传入的对象中这两个字段为空或者不存在,就会抛出对应的校验错误。
对应错误提示:Product validation failed: email: can't be blank, username: can't be blank.
常见触发场景
- 项目未配置请求体解析中间件:Express框架默认不会解析POST请求的请求体,你没有配置对应的解析中间件的话,
req.body会是空对象,导致传入create方法的参数缺少username和email字段。 - 请求参数格式/字段不符合要求:
- 发起请求时
Content-Type设置错误,比如传JSON参数却设置为text/plain,导致参数无法被正确解析 - 传入的参数字段名和Schema定义不匹配,比如拼写为
userName、Email这类大小写不匹配的字段名 - 传入的
username或email值为空字符串
- 发起请求时
解决方案
- 配置请求体解析中间件,在注册路由之前添加以下代码:
// 解析application/json格式的请求参数 app.use(express.json()) // 如果需要解析x-www-form-urlencoded格式的表单参数,额外添加以下代码 app.use(express.urlencoded({ extended: true })) // 如果需要传form-data格式的参数,安装multer中间件并按官方文档配置即可
- 校验请求参数:
- 确认请求头的
Content-Type和你传参的格式匹配,传JSON的话要设置为application/json - 确认参数中包含
username和email字段,字段名完全小写,且值不为空字符串
- 临时添加调试代码,在控制器的
Product.create执行前打印req.body,快速确认拿到的参数是否符合预期:
exports.newProduct = async (req, res, next) => { // 新增调试日志,排查参数接收问题,排查完成后可删除 console.log('接收到的请求参数:', req.body) const product = await Product.create(req.body); res.status(201).json({ success: true, product, }); };
内容的提问来源于stack exchange,提问作者David Anastasov
相关产品推荐
相关产品推荐

