From 79fe7d684c44586fe47667c60110271367ba6591 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Mon, 4 Feb 2019 16:35:42 +0000 Subject: [PATCH] Add parsed JSON output option to MQTT subscribe node --- .../@node-red/nodes/core/io/10-mqtt.html | 1 + .../@node-red/nodes/core/io/10-mqtt.js | 15 +++++++++++---- .../@node-red/nodes/locales/en-US/messages.json | 7 +++++-- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/packages/node_modules/@node-red/nodes/core/io/10-mqtt.html b/packages/node_modules/@node-red/nodes/core/io/10-mqtt.html index 6ba1dd4b1..274447e30 100644 --- a/packages/node_modules/@node-red/nodes/core/io/10-mqtt.html +++ b/packages/node_modules/@node-red/nodes/core/io/10-mqtt.html @@ -34,6 +34,7 @@ + diff --git a/packages/node_modules/@node-red/nodes/core/io/10-mqtt.js b/packages/node_modules/@node-red/nodes/core/io/10-mqtt.js index f50195844..83132130d 100644 --- a/packages/node_modules/@node-red/nodes/core/io/10-mqtt.js +++ b/packages/node_modules/@node-red/nodes/core/io/10-mqtt.js @@ -399,16 +399,23 @@ module.exports = function(RED) { if (this.topic) { node.brokerConn.register(this); this.brokerConn.subscribe(this.topic,this.qos,function(topic,payload,packet) { - if (node.datatype =="buffer") { + if (node.datatype === "buffer") { // payload = payload; - } else if (node.datatype =="base64") { + } else if (node.datatype === "base64") { payload = payload.toString('base64'); - } else if (node.datatype =="utf8") { + } else if (node.datatype === "utf8") { payload = payload.toString('utf8'); + } else if (node.datatype === "json") { + if (isUtf8(payload)) { + payload = payload.toString(); + try { payload = JSON.parse(payload); } + catch(e) { node.error(RED._("mqtt.errors.invalid-json-parse"),{payload:payload, topic:topic, qos:packet.qos, retain:packet.retain}); return; } + } + else { node.error((RED._("mqtt.errors.invalid-json-string")),{payload:payload, topic:topic, qos:packet.qos, retain:packet.retain}); return; } } else { if (isUtf8(payload)) { payload = payload.toString(); } } - var msg = {topic:topic,payload:payload, qos: packet.qos, retain: packet.retain}; + var msg = {topic:topic, payload:payload, qos:packet.qos, retain:packet.retain}; if ((node.brokerConn.broker === "localhost")||(node.brokerConn.broker === "127.0.0.1")) { msg._topic = topic; } diff --git a/packages/node_modules/@node-red/nodes/locales/en-US/messages.json b/packages/node_modules/@node-red/nodes/locales/en-US/messages.json index 59b39160d..8d2ba84cf 100644 --- a/packages/node_modules/@node-red/nodes/locales/en-US/messages.json +++ b/packages/node_modules/@node-red/nodes/locales/en-US/messages.json @@ -353,7 +353,8 @@ "buffer": "a Buffer", "string": "a String", "base64": "a Base64 encoded string", - "auto": "auto-detect" + "auto": "auto-detect (string or buffer)", + "json": "a parsed JSON object" }, "true": "true", "false": "false", @@ -362,7 +363,9 @@ "not-defined": "topic not defined", "missing-config": "missing broker configuration", "invalid-topic": "Invalid topic specified", - "nonclean-missingclientid": "No client ID set, using clean session" + "nonclean-missingclientid": "No client ID set, using clean session", + "invalid-json-string": "Invalid JSON string", + "invalid-json-parse": "Failed to parse JSON string" } }, "httpin": {