如何在node-postgres的SQL查询JSON路径中绑定$1参数
问题原因
报错的根本原因是你把参数占位符$1写在了单引号包裹的JSONPath字符串内部,PostgreSQL会将单引号内的所有内容识别为字符串字面量,不会解析其中的$1为参数占位符,因此数据库认为你没有声明任何参数,你传入1个参数就触发了参数数量不匹配的报错。
解决方法
推荐使用无SQL注入风险的标准写法,通过jsonb_path_exists函数传递外部参数到JSONPath逻辑中,修改后的完整代码如下:
app.get("/items/:data", async (req, res) => { const { data } = req.params; const query = ` SELECT items.discount FROM items WHERE jsonb_path_exists( items.discount, '$[*] ? (@.discount[*].shift == $shift)', jsonb_build_object('shift', $1) ) ` try { const obj = await pool.query(query, [data]); res.json(obj.rows[0] ?? null) } catch(err) { console.error(err.message); res.sendStatus(500) } });
额外注意事项
- 如果你的
discount字段是json类型而非jsonb类型,需要先转成jsonb再处理:items.discount::jsonb - 所有PostgreSQL的参数占位符
$n都不能放在单引号内部,否则都会被识别为普通字符串无法完成绑定 - 不要直接拼接用户输入的参数到SQL语句中,会引发SQL注入漏洞,上述写法完全基于参数绑定,安全可靠
内容的提问来源于stack exchange,提问作者Ulvi
相关产品推荐
相关产品推荐

