使用pg-promise命名参数执行UPDATE时触发ReferenceError问题排查
解决pg-promise命名参数在db.task中使用的问题
看起来你在这里踩了一个很常见的新手坑——直接用JavaScript模板字符串拼接SQL语句,完全没用到pg-promise专为参数化查询设计的功能。这种写法不仅有SQL注入的风险,还容易因为类型转换问题触发SQL语法错误。
问题根源
你当前的代码是直接把变量硬塞进SQL字符串:
await t.none(`UPDATE product SET display = ${display}, product_date = ${product_date} ...`)
这种方式绕过了pg-promise的参数处理机制,而且如果display是字符串类型,还会因为缺少引号直接报错。
正确的命名参数用法
pg-promise支持**:变量名格式的命名占位符**,你只需要把SQL里的变量替换成对应占位符,再把你的editProductObj作为第二个参数传给none方法就行:
db.task('edit-product', async t => { console.log(editProductObj) console.log(typeof(editProductObj)) console.log('display' in editProductObj) // 更新产品 - 正确使用命名参数 await t.none(` UPDATE product SET display = :display, product_date = :product_date // 务必加上WHERE条件!不然会更新表中所有数据! WHERE product_id = :product_id `, editProductObj) })
为什么这样做更靠谱?
- pg-promise会自动处理参数类型转换,比如把JS的Date对象转成PostgreSQL能识别的日期格式,字符串自动补全引号
- 彻底避免SQL注入,因为参数会被数据库驱动安全转义
- 代码更简洁,不用手动从
editProductObj里挨个提取属性
重要提醒
千万别忘了在UPDATE语句里加WHERE条件!漏掉的话会把表中所有产品的信息批量修改,这绝对是生产环境的致命操作。
内容的提问来源于stack exchange,提问作者BML91
相关产品推荐
相关产品推荐

