我觉得我在这里错过了一些非常简单的东西。
我正在尝试将命名参数与 pg-promise
一起使用,如 outlined here.
我正在使用嵌套在 db.task
函数中的函数,editProductObj
是从我网站上的 HTML 表单获取的。 MWE 如下:
db.task('edit-product', async t => {
console.log(editProductObj)
console.log(typeof(editProductObj))
console.log('display' in editProductObj)
// update product
await t.none(`UPDATE
product
SET
display = ${display},
product_date = ${product_date}
WHERE
product_id = ${product_id}`, editProductObj)
}).catch(err=>{console.log(err)})
将其输出到控制台:
{
display: 'true',
product_date: 2018-01-01T00:00:00.000Z,
product_id: '1'
} // object looks like what I expected
object // object is indeed an object
true // display is in the object passed
并且还输出错误:
ReferenceError: display is not defined
这让我相信 t.none
函数没有正确访问 editProductObj
对象,因为 console.log
输出表明输入没问题。
最佳答案
您正在使用 ES6 模板字符串,而不是 Named Parameters的pg-promise .
如文档所述,该库通过其 Named Parameters 支持灵活的语法。 :
syntax $propName, with * being any of the following open-close pairs: {}, (), <>, [], //
如果你想使用Named Parameters在 ES6 模板字符串内部,您需要使用库的替代开闭对之一,以避免语法冲突:
-
$(propName)
-
$[propName]
-
$<propName>
-
$/propName/
您只能使用语法${propName}
来自常规字符串或外部 SQL 文件。
示例
这个可以正常工作:
await t.none(`UPDATE
product
SET
display = $/display/,
product_date = $/product_date/
WHERE
product_id = $/product_id/`, editProductObj)
这个也是如此:
await t.none('UPDATE product SET display = ${display}, ' +
'product_date = ${product_date} WHERE ' +
'product_id = ${product_id}', editProductObj)
如果你想正确管理复杂的 SQL,你应该在外部使用它,通过 Query Files ,您将能够使用${propName}
那里的语法;)
关于javascript - pg-promise 在更新中使用命名参数会导致 ReferenceError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49946819/