错误:类型为json postgreSQL NodeJS的输入语法无效

时间:2019-11-03 13:04:20

标签: json postgresql

我遇到以下错误

  

错误:json类型的输入语法无效

await this.db.query(
  `UPDATE guest_group
  SET custom_fields = jsonb_insert(custom_fields, '{0}', '{"value": $3, "display_name": "Traces", "servicio_tags": ["trace"]}'::jsonb, true)
  WHERE '{"value": $1}' <@ ANY(
  SELECT el
  FROM jsonb_array_elements(custom_fields) AS el
  WHERE el->'servicio_tags' = '["full-name"]'::jsonb)
  AND '{"value": $2}' <@ ANY(
  SELECT el
  FROM jsonb_array_elements(custom_fields) AS el
  WHERE el->'servicio_tags' = '["room-number"]'::jsonb)`,[
   trace.guestName,
   trace.guestRoomNumber,
   trace.value
]);

其中trace是以下对象:

AppTrace {
  value:'test',
  guestName: 'Bortolotti, Ingrid',
  guestRoomNumber: '422',
}

我不知道我在做什么错。我认为这与插入值有关。感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

您缺少JSON字符串周围的引号。这应该起作用:

await this.db.query(
  `UPDATE guest_group
  SET custom_fields = jsonb_insert(custom_fields, '{0}', '{"value": $3, "display_name": "Traces", "servicio_tags": ["trace"]}'::jsonb, true)
  WHERE '{"value": $1}' <@ ANY(
  SELECT el
  FROM jsonb_array_elements(custom_fields) AS el
  WHERE el->'servicio_tags' = '["full-name"]'::jsonb)
  AND '{"value": $2}' <@ ANY(
  SELECT el
  FROM jsonb_array_elements(custom_fields) AS el
  WHERE el->'servicio_tags' = '["room-number"]'::jsonb)`,[
   JSON.stringify(trace.guestName),
   JSON.stringify(trace.guestRoomNumber),
   JSON.stringify(trace.value)
]);

但是,我宁愿将整个JSON(B)值传递给查询,并让node-pg进行转义:

await this.db.query(
  `UPDATE guest_group
  SET custom_fields = jsonb_insert(custom_fields, '{0}', $3::jsonb, true)
  WHERE $1 <@ ANY(
  SELECT el
  FROM jsonb_array_elements(custom_fields) AS el
  WHERE el->'servicio_tags' = '["full-name"]'::jsonb)
  AND $2 <@ ANY(
  SELECT el
  FROM jsonb_array_elements(custom_fields) AS el
  WHERE el->'servicio_tags' = '["room-number"]'::jsonb)`,[
   {"value": trace.guestName },
   {"value": trace.guestRoomNumber },
   {"value": trace.value, "display_name": "Traces", "servicio_tags": ["trace"]}
]);

或使用the other query

await this.db.query(
  `UPDATE guest_group
  SET custom_fields = jsonb_insert(custom_fields, '{0}', $3::jsonb, true)
  WHERE EXISTS (
    SELECT 1
    FROM jsonb_array_elements(custom_fields) AS el
    WHERE el->>'value' = $1
      AND el->'servicio_tags' = '["full-name"]'::jsonb)
  AND EXISTS (
    SELECT 1
    FROM jsonb_array_elements(custom_fields) AS el
    WHERE el->>'value' = $2
      AND el->'servicio_tags' = '["room-number"]'::jsonb)
`, [
   trace.guestName,
   trace.guestRoomNumber,
   {"value": trace.value, "display_name": "Traces", "servicio_tags": ["trace"]}
]);