Saya menggunakan Postgres 9.6.6-alpine dan Knex.json pada node. Saya mencoba menambahkan ke kolom json.

Ini bekerja.

  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');
    });

Saya ingin alertBody menjadi parameter lain tetapi ini tidak berhasil untuk saya.

  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 $1
db_1              | STATEMENT:  UPDATE malware_submissions
db_1              |               SET results_children = COALESCE(results_children, '[]'::jsonb) || 
'["$1"]'::jsonb
db_1              |               WHERE request_id=$2
db_1              |
api_1             | parent error

Saya percaya ini terkait dengan kutipan tetapi saya tidak yakin apa yang harus dihindari.

0
Ryan McGuirk 10 Maret 2020, 19:02

1 menjawab

Jawaban Terbaik

Mungkin Anda mencoba melakukan ini (perhatikan bagaimana string concat dilakukan untuk string variabel alertBody dengan cara yang aman untuk injeksi sql):

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

Cara lain adalah ini:

await db('malware_submissions')
  .update({
    results_children: db.raw(
      `COALESCE(??, '[]'::jsonb) || ?::jsonb`, 
      ['results_children', `["${alertBody}]"]`]
    )
  })
  .where('request_id', parentId);
0
Mikael Lepistö 11 Maret 2020, 10:06