3

我是节点新手,随后是 pg-promise。我在我的 node express 应用程序中试图实现的是一个路由,它将作为一个 api 在数据库中的表中执行单个字段更新。这必须只是一个将使用表名、列名、列值和列 id 值调用的单一路由,以识别表中要更新的行。

这是我到目前为止尝试过的代码,但我似乎无法正确:

router.post('/update_db_field', function (req, res, next) {
    db.one('update $table~ set $dbcol~=$dbcolval~ where $dbcolid~=$dbcolidval~ returning $colid~', [
        req.body.table, 
        req.body.dbcol, 
        req.body.dbcolid, 
        req.body.dbcolval, 
        req.body.dbcolidval
    ]).then(function (data) {
        console.log(data)
        res.send(data)
    }).catch(function (error) {
        console.log("ERROR:", error.message || error); // print error;
    });
})

不幸的是,它引发了以下错误:

ERROR: syntax error at or near "$"

还有一种方法可以从catch()函数中打印查询字符串,这样调试会更容易一些吗?

4

1 回答 1

3

您将变量格式与命名参数混淆,您的查询应该是:

router.post('/update_db_field', function (req, res, next) {
    db.one('UPDATE ${table~} SET ${dbcol~} = ${dbcolval} WHERE ${dbcolid~} = {dbcolidval} RETURNING ${colid~}', req.body, a => a[req.body.dbcolid])
    .then(function (dbcolid) {
        console.log(dbcold)
        res.send(dbcolid)
    })
    .catch(function (error) {
        console.log("ERROR:", error.message || error); // print error;
    });
})

尽管您仍然可能会遇到问题,因为传入动态表 + 列意味着您不知道如何将它们转换为正确的类型,因此例如,您最终可能会dbcolval以字符串的形式传入,而它需要是一个整数,然后查询将因此而拒绝。

请注意,我们添加了 optional a => a[req.body.dbcolid],因此不是使用具有一个属性的对象进行解析,而是直接使用属性值进行解析。

如何查看控制台中打印的查询文本?

var query = pgp.as.format(query, values);
console.log(query);

API:as.format

于 2017-02-07T08:35:53.587 回答