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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 08:12:03