无法确定 knex.js 和 Postgres 中参数 $1 的数据类型

could not determine data type of parameter $1 in knex.js and Postgres

我在节点上使用 Postgres 9.6.6-alpine 和 Knex.json。 我正在尝试附加到 json 列。

这有效。

  const alertBody = encodeURIComponent(JSON.stringify(req.body.alert));
  updateMal = await db
    .raw(
      `UPDATE malware_submissions
      SET results_children = COALESCE(results_children, '[]'::jsonb) || '["${alertBody}"]'::jsonb
      WHERE request_id=:id
      `,
      { id: parentId },
    )
    .then(() => {
      console.log('help');
    });

我想让 alertBody 成为另一个参数,但这对我不起作用。

  const alertBody = encodeURIComponent(JSON.stringify(req.body.alert));
  updateMal = await db
    .raw(
      `UPDATE malware_submissions
      SET results_children = COALESCE(results_children, '[]'::jsonb) || '[":body"]'::jsonb
      WHERE request_id=:id
      `,
      { body: alertBody, id: parentId },
    )
    .then(() => {
      console.log('help');
    });


uh oh undefined
db_1              | ERROR:  could not determine data type of parameter 
db_1              | STATEMENT:  UPDATE malware_submissions
db_1              |               SET results_children = COALESCE(results_children, '[]'::jsonb) || 
'[""]'::jsonb
db_1              |               WHERE request_id=
db_1              |
api_1             | parent error

我相信这与引文有关,但我不确定要逃避什么。

也许您正在尝试这样做(请注意如何以 sql 注入安全方式对 alertBody 变量字符串进行字符串连接):

await db('malware_submissions')
  .update({
    results_children: db.raw(
      `COALESCE(??, '[]'::jsonb) || ('["' || ? || '"]')::jsonb`, 
      ['results_children', alertBody]
    )
  })
  .where('request_id', parentId);

其他方式是这样的:

await db('malware_submissions')
  .update({
    results_children: db.raw(
      `COALESCE(??, '[]'::jsonb) || ?::jsonb`, 
      ['results_children', `["${alertBody}]"]`]
    )
  })
  .where('request_id', parentId);