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

时间:2018-04-20 17:21:23

标签: 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输出表明输入正常。

2 个答案:

答案 0 :(得分:1)

您将javascript字符串模板与pg-promise模板混淆。只需将您的反向标记更改为单引号即可。

答案 1 :(得分:1)

您使用的是ES6模板字符串,而不是Named Parameterspg-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}语法;)