【问题标题】:Working SQL yields Syntax Error in pg-promise工作 SQL 在 pg-promise 中产生语法错误
【发布时间】:2021-01-02 18:04:06
【问题描述】:

我的一个端点中有以下代码:

    let setText = ''
    for (const [ key, value ] of Object.entries(req.body.info)) {
        setText = setText.concat(`${key} = ${value}, `)
    }
    // Last character always an extra comma and whitespace
    setText = setText.substring(0, setText.length - 2)

    db.one('UPDATE students SET ${setText} WHERE id = ${id} RETURNING *', { setText, id: req.body.id })
        .then(data => {
            res.json({ data })
        })
        .catch(err => {
            res.status(400).json({'error': err.message})
        })

它应该从请求正文中动态生成 SQL。当我记录创建的 SQL 时,它会正确生成。当我直接查询数据库时,它甚至可以工作。但是,每当我运行端点时,无论setText 是什么,我都会收到一个“位于或接近”的语法错误。我试过使用切片而不是子字符串,没有任何变化。

【问题讨论】:

  • 您是否尝试过在thencatch 部分中使用console.log 来查看触发了哪个/哪个?
  • 你绝不能手动连接值,你这样做的方式是严格禁止查询的。您必须使用库提供的格式化引擎。
  • @Graham 正在触发捕获,因为在请求时,我得到 400 和错误对象。
  • 在问题文本中可以看到非常有价值的信息。

标签: javascript sql postgresql express pg-promise


【解决方案1】:

您不应该手动连接值,因为它们没有被正确转义,并打开您的代码以进行可能的 SQL 注入。

使用图书馆提供的工具。对于来自动态对象的UPDATE,请参见下文:

const cs = new pgp.helpers.ColumnSet(req.body.info, {table: 'students'});

const query = pgp.helpers.update(req.body.info, cs) +
                  pgp.as.format(' WHERE id = ${id} RETURNING *', req.body);

db.one(query)
    .then(data => {
        res.json({ data });
    })
    .catch(err => {
        res.status(400).json({error: err.message})
    });

【讨论】:

  • 我对这个库还是很陌生,感谢您的帮助,我稍后会试一试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多