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

PostgreSQL整数类型输入语法无效错误排查(Express.js项目)

错误原因分析

错误提示invalid input syntax for type integer: "NaN",核心问题是传给PostgreSQL的参数是NaN(非有效数字),而数据库messages表的id字段是INTEGER类型,无法解析NaN。

虽然你用了parseInt(id)转换参数,但当输入的id不是有效数字字符串时(比如用户手动访问/abc这类异常路径,或者前端生成链接时出现错误),parseInt()会返回NaN——注意typeof NaN的结果确实是number,所以你打印的typeof id无法识别这个无效值。

解决方法

1. 控制器层先做参数有效性校验

在viewMessage控制器里先验证req.params.id是否为有效整数,无效则直接返回400错误,避免无效值进入查询流程:

export const viewMessage = async (req, res) => {
  const idStr = req.params.id;
  // 用正则验证是否是纯数字字符串
  if (!/^\d+$/.test(idStr)) {
    return res.status(400).send("无效的消息ID");
  }
  const message = await getMessageByID(parseInt(idStr));
  res.render("message", { message: message });
};

2. 查询函数内增加二次校验

在getMessageByID里确保传入的id是有效整数,进一步拦截无效值:

export const getMessageByID = async (id) => {
  // 检查是否是有效整数
  if (!Number.isInteger(id)) {
    throw new Error("无效的ID格式");
  }

  const { rows } = await pool.query("SELECT * FROM messages where id = $1", [
    id,
  ]);
  console.log(rows);

  return rows;
};

3. 前端链接生成优化(从源头避免问题)

确认EJS模板中message.id是整数类型,如果数据库返回的id意外是字符串(部分驱动可能存在这种情况),可以强制转换为数字后再渲染链接:

<a href="/<%= Number(message.id) %>"><button>Open</button></a>

通过以上多重校验,就能彻底避免NaN传入数据库查询,解决22P02类型错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 05:43:16