cagksw
28. Juni 2018 um 12:43
1
Grüß Euch und ein Hallo an Alle hier im Forum!
Ich bin mit PostgreSQL noch nicht so vertraut und habe eine Frage zum Datentyp json bzw. jsonb.
Der Unterschied zwischen den beiden Datentypen ist mir soweit bekannt.
Ich arbeite im Moment an einem Projekt (https://stackoverflow.com/questions/51079864/postgresql-invalid-input-syntax-for-type-json-any-ideas auf Stackoverflow) mit node, express, pg-node angular und PostgreSQL.
Hier das setup:
Und hier ein Beispiel-Table mit Namen ‘tmp’
via pgAdmin 4 funktioniert es ohne Probleme:
UPDATE tmp SET data = '{"foo": false}' WHERE id = '1'
Aber wenn ich ein UPDATE über meine Express-Route via pg ausführe:
router.put('/updateTMP', (req, res) => {
// Ich verwende DummyData anstatt req.body.someKey zum Testen
let dummyJSON = {"foo":true};
let dummyID = 1;
pg.query(`UPDATE tmp SET data = '${dummyJSON}' WHERE id = '${dummyID}'`, (errUpdate, responseUpdate) => {
if (!errUpdate) { // NO ERROR
res.json({success: true, message: responseUpdate});
}
else { // ERROR
console.log(dummyJSON);
console.log(errUpdate);
res.json({success: false, message: errUpdate});
}
})
})
erhalte ich folgende Fehlermeldung:
error: invalid input syntax for type json
Und wenn ich die interne Funktion to_json() verwende, erhalte ich folgende Fehlermeldung:
error: 'could not determine polymorphic type because input has type "unknown"'
Habe ich da etwas gravierendes übersehen oder verstehe ich http://json.org/ und https://www.postgresql.org/docs/9.6/static/datatype-json.html falsch?
vermutlich ein Quoting-Problem. Was steht im Log der DB?
cagksw
28. Juni 2018 um 13:04
3
hier der STDERR via Terminal:
{ error: invalid input syntax for type json
at Connection.parseE (C:\projects\CUPERIN\node_modules\pg\lib\connection.js:553:11)
at Connection.parseMessage (C:\projects\CUPERIN\node_modules\pg\lib\connection.js:378:19)
at Socket. (C:\projects\CUPERIN\node_modules\pg\lib\connection.js:119:22)
at emitOne (events.js:116:13)
at Socket.emit (events.js:211:7)
at addChunk (_stream_readable.js:263:12)
at readableAddChunk (_stream_readable.js:250:11)
at Socket.Readable.push (_stream_readable.js:208:10)
at TCP.onread (net.js:607:20)
name: ‘error’,
length: 161,
severity: ‘ERROR’,
code: ‘22P02’,
detail: ‘Token “object” is invalid.’,
hint: undefined,
position: ‘55’,
internalPosition: undefined,
internalQuery: undefined,
where: ‘JSON data, line 1: [object…’,
schema: undefined,
table: undefined,
column: undefined,
dataType: undefined,
constraint: undefined,
file: ‘json.c’,
line: ‘1244’,
routine: ‘report_invalid_token’ }
das ist nicht das Log der DB …
cagksw
28. Juni 2018 um 13:10
5
in postgresql.conf ist der default 'stderr ’ via terminal…
‘The default is to log to stderr only. This parameter can only be set in the postgresql.conf file or on the server command line.’
link: https://www.postgresql.org/docs/9.6/static/runtime-config-logging.html
oder verstehe ich da etwas falsch?
ps: ich schau mal in die pg_log.
cagksw
28. Juni 2018 um 13:26
6
2017-04-27 01:09:32.993 CEST [11087] LOG: database system was shut down at 2017-04-27 01:09:31 CEST
2017-04-27 01:09:32.997 CEST [11087] LOG: MultiXact member wraparound protections are now enabled
2017-04-27 01:09:33.010 CEST [11091] LOG: autovacuum launcher started
2017-04-27 01:09:33.011 CEST [11085] LOG: database system is ready to accept connections
2017-04-27 01:09:33.393 CEST [11093] [unknown]@[unknown] LOG: incomplete startup packet
2017-04-27 01:10:25.301 CEST [11115] postgres@cuperin ERROR: invalid input syntax for type json at character 55
2017-04-27 01:10:25.301 CEST [11115] postgres@cuperin DETAIL: Token “object” is invalid.
2017-04-27 01:10:25.301 CEST [11115] postgres@cuperin CONTEXT: JSON data, line 1: [object…
2017-04-27 01:10:25.301 CEST [11115] postgres@cuperin STATEMENT: UPDATE tmp SET data = ‘[object Object]’ WHERE id = ‘1’
‘[object Object]’ ist kein valides JSON
cagksw
28. Juni 2018 um 13:55
8
Danke für deine Hilfe das ist mir bereits aufgefallen, nur verstehe ich nicht ganz wie aus {“foo”:true} (valides JSON) ein [object Object] werden kann - dürfte eventuell am pg-modul von node liegen - werd mir das mal genauer anschauen…
cagksw
28. Juni 2018 um 14:28
9
Einige console.log’s später ist mir bewusst geworden, das Node’s V8 JavaScript engine das als Variable übergebene JSON-Objekt als [object] wahrnimmt:
let updateData = {“foo”:true};
pg.query(UPDATE tmp SET data = '${updateData}' WHERE id = '1'
, (errUpdate, responseUpdate) => { …
Wenn ich die Query in text ausformuliere und nur den boolean-Wert als Variable übergebe funktioniert es:
let statusFoo = true;
pg.query(UPDATE tmp SET data = '{"foo":${statusFoo}}' WHERE id = '1'
, (errUpdate, responseUpdate) => { …
Danke Dir @akretschmer für Deine Hilfe und die rasche Response!
cagksw
28. Juni 2018 um 15:18
10
Ich schick dir ein paar gute Weine aus der Thermen-Region ins 2ndQuadrant Büro
Bevorzugst Du weiss oder rot/resch oder lieblich?
ich nehme was kommt, aber ich sitze im Homeoffice bei Dresden. Nicht daß das meinem Chef in die Hände fällt