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
相关产品推荐
相关产品推荐

