如何将 $1 添加到查询中的 json 路径中?

How to add $1 into json path in the query?

这是我正在使用的查询:

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

    const { data } = req.params;

    query = `
        SELECT items.discount
        FROM items
        WHERE items.discount @? '$[*] ? (@.discount[*].shift == )'
        `
    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.js 中使用 node-postgres 包。

我该如何解决这个问题?

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

WHERE items.discount @? 

或者将 SQL 中的字符串拼凑起来,例如,连接运算符:

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

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

如果提供的数据与您想象的不一样,您应该仔细考虑这两种情况中的一种或两种是否会使您容易受到注入攻击。该参数的使用应该可以保护您免受 SQL 注入攻击,但不能从本质上防止 jsonpath 注入。