我觉得我在这里错过了一些非常简单的东西。
我正在尝试将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
输出表明输入正常。
答案 0 :(得分:1)
您将javascript字符串模板与pg-promise模板混淆。只需将您的反向标记更改为单引号即可。
答案 1 :(得分:1)
您使用的是ES6模板字符串,而不是Named Parameters的pg-promise。
如文档所述,该库支持灵活的语法及其Named Parameters:
语法$ propName ,*为以下任何开 - 关对:{},(),<>,[],//
如果你想在ES6模板字符串中使用Named Parameters,你需要使用一个库的替代开 - 关对,以避免语法冲突:
$(propName)
$[propName]
$<propName>
$/propName/
您只能在常规字符串或外部SQL文件中使用语法${propName}
。
<强>实施例强>
这个会正常工作:
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}
语法;)