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} 语法 ;)