RESTful API发送POST请求报Product validation failed错误如何修复
问题根因
你遇到的报错由两个核心问题导致:
- 缺少JSON请求体解析配置:你当前仅配置了
body-parser对x-www-form-urlencoded格式请求的解析能力,如果你在Postman中发送的是JSON格式的请求参数(也就是选了raw->JSON的传参方式),服务端无法解析对应格式的请求体,会导致req.body是空对象,所有Mongoose Schema中定义的必填字段都没有值,直接触发校验失败。 - 异步逻辑没有做异常捕获:
Product.create是异步方法,校验失败时会抛出Promise拒绝状态,你没有用try/catch块捕获异常,也没有配套的错误处理中间件,所以控制台会抛出UnhandledPromiseRejectionWarning警告。
修复步骤
- 新增JSON请求解析中间件
在Express配置部分新增JSON解析规则,Express v4.16.0之后已经内置了请求体解析能力,无需额外依赖body-parser,你可以直接替换原有body-parser配置:
// 替换原有app.use(bodyParser.urlencoded(...))配置 app.use(express.urlencoded({extended: true})); // 新增JSON解析 app.use(express.json());
如果你坚持使用body-parser,则新增一行配置即可:
app.use(bodyParser.json());
- 给路由添加异常捕获
修改/products的POST路由,用try/catch包裹异步逻辑,异常时返回对应错误响应:
app.route("/products") .post(async function(req, res, next){ try { const product = await Product.create(req.body); res.status(201).send({ success: true, product }) } catch (err) { // 校验失败返回400错误,带上错误信息 res.status(400).send({ success: false, message: err.message }) } })
Postman测试注意事项
测试时请在Body标签页选择raw,格式选择JSON,按照Schema要求传入所有必填字段,示例请求体如下:
{ "name": "示例商品", "price": 29.9, "description": "商品详情描述", "category": "数码配件", "seller": "官方旗舰店", "stock": 200 }
如果你要使用form-data格式传参,还需要额外引入multer中间件解析对应格式的请求体。
内容的提问来源于stack exchange,提问作者vinuka pussepitiya
相关产品推荐
相关产品推荐

