pg-promise 在 ReferenceError 更新结果中使用命名参数
pg-promise using named parameters on an update results in ReferenceError
我觉得我在这里遗漏了一些非常简单的东西。
我正在尝试将命名参数与 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
输出表明输入正常。
您将 javascript 字符串模板与 pg-promise 模板混淆了。只需将反引号更改为单引号即可。
您使用的是 ES6 模板字符串,而不是 Named Parameters of pg-promise。
如文档所述,该库支持灵活的语法 Named Parameters:
syntax $propName, with * being any of the following open-close pairs: {}, (), <>, [], //
如果你想在 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}
语法 ;)
我觉得我在这里遗漏了一些非常简单的东西。
我正在尝试将命名参数与 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
输出表明输入正常。
您将 javascript 字符串模板与 pg-promise 模板混淆了。只需将反引号更改为单引号即可。
您使用的是 ES6 模板字符串,而不是 Named Parameters of pg-promise。
如文档所述,该库支持灵活的语法 Named Parameters:
syntax $propName, with * being any of the following open-close pairs: {}, (), <>, [], //
如果你想在 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}
语法 ;)