【问题标题】:pg-promise using named parameters on an update results in ReferenceErrorpg-promise 在更新中使用命名参数导致 ReferenceError
【发布时间】:2018-04-21 05:02:56
【问题描述】:

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

我正在尝试使用 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 node.js pg-promise


    【解决方案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} 语法;)

    【讨论】:

    • 查询文件,有意思,我好像每天都在学习一些关于pg-promise的新东西。
    • @BML91 Query Files 是该库最强大的功能之一。请参阅pg-promise-demo,或一些大型项目如何使用它,例如LISK
    【解决方案2】:

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

    【讨论】:

    • 我认为这很简单。有趣的是,我现在遇到了一个新错误,但可能超出了这个问题的范围。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2020-04-18
    • 2017-11-18
    • 2017-11-29
    • 2017-04-03
    • 1970-01-01
    • 1970-01-01
    • 2016-09-13
    • 2016-12-30
    相关资源
    最近更新 更多