Invalid input syntax for type json..

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:
Diagram_01.png
Und hier ein Beispiel-Table mit Namen ‘tmp’
table_example.PNG
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?
Diagram_01.png

vermutlich ein Quoting-Problem. Was steht im Log der DB?

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 …

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.

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

Danke für deine Hilfe :wink: 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…

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!

Ich schick dir ein paar gute Weine aus der Thermen-Region ins 2ndQuadrant Büro :wink:
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 :wink: