首页 > 解决方案 > 如何在查询中将 $1 添加到 json 路径中?

问题描述

这是我正在使用的查询:

app.get("/items/:data", async (req, res) => {

    const { data } = req.params;

    query = `
        SELECT items.discount
        FROM items
        WHERE items.discount @? '$[*] ? (@.discount[*].shift == $1)'
        `
    try {

        const obj = await pool.query(query, [data]);
        res.json(obj.rows[0])

    } catch(err) {

        console.error(err.message);

    }
});

我收到此错误:

error: bind message supplies 1 parameters, but prepared statement "" requires 0

node-postgresnode.js.

我该如何解决这个问题?

标签: node.jspostgresqlnode-postgres

解决方案


在引号内,占位符不是占位符,它只是两个字符,一个美元符号和一个数字。您要么必须在客户端中构建整个 jsonpath 并将其作为一个参数发送:

WHERE items.discount @? $1

或者使用例如连接运算符将其从 SQL 中的字符串拼凑在一起:

WHERE items.discount @? ('$[*] ? (@.discount[*].shift == '||$1||')')::jsonpath

您需要括号来获得正确的优先级,并且您需要显式转换,因为一旦您从文本组装它,它将不再将其隐式转换为 jsonpath。

如果提供的数据看起来不像您想象的那样,您应该仔细考虑这两者中的一个或两个是否会使您面临注入攻击。使用该参数应该可以保护您免受 SQL 注入攻击,但不能固有地免受 jsonpath 注入。


推荐阅读