Node.js参数化SQL多位置传同一变量触发语法错误该如何解决?
报错原因
PostgreSQL(node-postgres库)的参数化查询规则中,$n格式的占位符仅支持传递值类型参数,数据库会自动将传入的内容转义为字面量,不能用于动态指定列名、表名这类SQL标识符。
你之前将列名放在$1的位置,数据库解析时会将其识别为字符串值而非列名,不符合UPDATE语句的语法要求,就会抛出syntax error at or near "$1"的错误。
修复方案
- 首先对传入的列名做白名单校验,避免SQL注入风险:
// 替换为你业务中允许更新的数值类字段列表 const ALLOWED_UPDATE_COLUMNS = ['points', 'balance', 'login_count', 'level'] if (!ALLOWED_UPDATE_COLUMNS.includes(columnName)) { throw new Error('不允许更新的字段') }
- 用模板字符串拼接合法的列名到SQL语句中,剩余的值参数继续使用参数化占位符传递:
const sqlStatement = `UPDATE tableName SET ${columnName} = ${columnName} + $1 WHERE id = $2` await client.query(sqlStatement, [changeBy, id])
内容的提问来源于stack exchange,提问作者nickcoding2
相关产品推荐
相关产品推荐

