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

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警告。
修复步骤
  1. 新增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());
  1. 给路由添加异常捕获
    修改/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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 07:27:02