node.js - 如何在查询中将 $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-postgres
在node.js
.
我该如何解决这个问题?
解决方案
在引号内,占位符不是占位符,它只是两个字符,一个美元符号和一个数字。您要么必须在客户端中构建整个 jsonpath 并将其作为一个参数发送:
WHERE items.discount @? $1
或者使用例如连接运算符将其从 SQL 中的字符串拼凑在一起:
WHERE items.discount @? ('$[*] ? (@.discount[*].shift == '||$1||')')::jsonpath
您需要括号来获得正确的优先级,并且您需要显式转换,因为一旦您从文本组装它,它将不再将其隐式转换为 jsonpath。
如果提供的数据看起来不像您想象的那样,您应该仔细考虑这两者中的一个或两个是否会使您面临注入攻击。使用该参数应该可以保护您免受 SQL 注入攻击,但不能固有地免受 jsonpath 注入。
推荐阅读
- python - 在 Pandas 中将数据框列表导出和导入为 json 文件
- android - 无法在循环访问房间数据库之外获取文本输入
- hibernate - 如何在 Hibernate 中为 @oneToMnay 左连接设置 projectionList/resultTransformer
- django - Django ModelForm 某些字段未保存
- generics - 基元的通用数组
- php - 如何在此代码中放置一个 else 函数?
- javascript - 检查 React Native 应用程序中捕获的错误
- asp.net-mvc - 如何对具有相同结构的不同表使用相同的局部视图?
- php - 通过 php 将动画 gif 加载到 LED 矩阵
- docusignapi - 如何使用基于知识的身份验证和嵌入式签名(收件人视图)?