javascript - pg-promise 在更新中使用命名参数会导致 ReferenceError

标签 javascript node.js pg-promise

我觉得我在这里错过了一些非常简单的东西。

我正在尝试将命名参数与 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 Parameterspg-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/

相关文章:

javascript - 如何在 Javascript 中执行以 base64 编码的代码

javascript - Mongoose 模型不包括返回时的附加值

node.js - 在 pg-promise 中跨多个 Controller 的多个查询之间共享事务或任务对象

javascript - 如何避免从闭包中访问可变变量

postgresql - 多个查询的批处理 INSERT 引发外键冲突

postgresql - 如何从数据库插入返回串行主键以用于另一个数据库插入

javascript - 如何计算预计时间精度

javascript - 如何通过单击模态窗口外的任意位置来关闭模态

javascript - 为基于Vue店面的网上商店设置RSS Feed(Google购物)

node.js - 使用socket.io中的socket.id断开客户端的套接字