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

使用PostgreSQL/Sequelize发送POST请求时出现整数类型输入语法无效错误,请求排查问题原因

解决PostgreSQL/Sequelize POST请求报错:invalid input syntax for type integer: "12 Pro"

这个错误的核心逻辑很直白——你给PostgreSQL的整数类型字段传了带非数字内容的字符串("12 Pro"),数据库没法把这个混合内容转成整数,所以抛出了类型语法错误。结合你的代码片段,具体原因和解决思路如下:

最可能的触发点:前端传参错误

你的代码里,brandId和typeId这两个字段几乎肯定是数据库里的整数类型外键(用来关联品牌表/类型表的ID)。但前端请求时,误把品牌/类型的名称(比如"iPhone 12 Pro")当成ID传了过来,导致Sequelize把这个字符串直接传给PostgreSQL,触发类型转换失败。

次要诱因:后端缺少参数校验与类型转换

你的代码直接从req.body里取了brandId和typeId,没有做任何类型转换和校验。哪怕前端传的是字符串格式的纯数字(比如"12"),Sequelize大概率能自动处理,但如果是像"12 Pro"这种带非数字字符的字符串,就完全转不了整数了。

排查与解决步骤

  1. 先核对请求参数:用Postman或者浏览器开发者工具,查看POST请求的req.body里,brandId和typeId的具体值,确认是不是真的传成了"12 Pro"这类字符串。
  2. 修正前端传参逻辑:让前端确保这两个字段传的是对应品牌/类型的数字ID,而不是名称。
  3. 后端增加参数安全处理:在接收参数时主动做类型转换和合法性校验,比如:
async create(req, res, next) {
  try {
    let { name, price, brandId, typeId, info } = req.body;
    // 类型转换+有效性校验
    brandId = parseInt(brandId);
    typeId = parseInt(typeId);
    if (isNaN(brandId) || isNaN(typeId)) {
      return next(ApiError.badRequest("brandId和typeId必须是有效的数字ID"));
    }
    // 后续原有逻辑不变
    const { img } = req.files;
    let fileName = uuid.v4() + ".jpg";
    img.mv(path.resolve(__dirname, "..", "static", fileName));
    const device = await Device.create({ name, price, brandId, typeId, img: fileName });
    return res.json(device);
  } catch (e) {
    next(ApiError.badRequest(e.message));
  }
}

内容的提问来源于stack exchange,提问作者0101

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 01:48:12