From 45913e5ee87d3a8852844812882cf34f26ff561c Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Thu, 25 Jan 2018 16:58:42 +0000 Subject: [PATCH] Don't end mqtt client on first error Fixes #1566 --- nodes/core/io/10-mqtt.js | 121 ++++++++++++++++++++------------------- 1 file changed, 61 insertions(+), 60 deletions(-) diff --git a/nodes/core/io/10-mqtt.js b/nodes/core/io/10-mqtt.js index 7576a121c..507ddaf04 100644 --- a/nodes/core/io/10-mqtt.js +++ b/nodes/core/io/10-mqtt.js @@ -184,71 +184,72 @@ module.exports = function(RED) { this.connect = function () { if (!node.connected && !node.connecting) { node.connecting = true; - node.client = mqtt.connect(node.brokerurl ,node.options); - node.client.setMaxListeners(0); - // Register successful connect or reconnect handler - node.client.on('connect', function () { - node.connecting = false; - node.connected = true; - node.log(RED._("mqtt.state.connected",{broker:(node.clientid?node.clientid+"@":"")+node.brokerurl})); - for (var id in node.users) { - if (node.users.hasOwnProperty(id)) { - node.users[id].status({fill:"green",shape:"dot",text:"node-red:common.status.connected"}); - } - } - // Remove any existing listeners before resubscribing to avoid duplicates in the event of a re-connection - node.client.removeAllListeners('message'); - - // Re-subscribe to stored topics - for (var s in node.subscriptions) { - if (node.subscriptions.hasOwnProperty(s)) { - var topic = s; - var qos = 0; - for (var r in node.subscriptions[s]) { - if (node.subscriptions[s].hasOwnProperty(r)) { - qos = Math.max(qos,node.subscriptions[s][r].qos); - node.client.on('message',node.subscriptions[s][r].handler); - } - } - var options = {qos: qos}; - node.client.subscribe(topic, options); - } - } - - // Send any birth message - if (node.birthMessage) { - node.publish(node.birthMessage); - } - }); - node.client.on("reconnect", function() { - for (var id in node.users) { - if (node.users.hasOwnProperty(id)) { - node.users[id].status({fill:"yellow",shape:"ring",text:"node-red:common.status.connecting"}); - } - } - }) - // Register disconnect handlers - node.client.on('close', function () { - if (node.connected) { - node.connected = false; - node.log(RED._("mqtt.state.disconnected",{broker:(node.clientid?node.clientid+"@":"")+node.brokerurl})); + console.log("going for connect"); + try { + node.client = mqtt.connect(node.brokerurl ,node.options); + node.client.setMaxListeners(0); + // Register successful connect or reconnect handler + node.client.on('connect', function () { + node.connecting = false; + node.connected = true; + node.log(RED._("mqtt.state.connected",{broker:(node.clientid?node.clientid+"@":"")+node.brokerurl})); for (var id in node.users) { if (node.users.hasOwnProperty(id)) { - node.users[id].status({fill:"red",shape:"ring",text:"node-red:common.status.disconnected"}); + node.users[id].status({fill:"green",shape:"dot",text:"node-red:common.status.connected"}); } } - } else if (node.connecting) { - node.log(RED._("mqtt.state.connect-failed",{broker:(node.clientid?node.clientid+"@":"")+node.brokerurl})); - } - }); + // Remove any existing listeners before resubscribing to avoid duplicates in the event of a re-connection + node.client.removeAllListeners('message'); - // Register connect error handler - node.client.on('error', function (error) { - if (node.connecting) { - node.client.end(); - node.connecting = false; - } - }); + // Re-subscribe to stored topics + for (var s in node.subscriptions) { + if (node.subscriptions.hasOwnProperty(s)) { + var topic = s; + var qos = 0; + for (var r in node.subscriptions[s]) { + if (node.subscriptions[s].hasOwnProperty(r)) { + qos = Math.max(qos,node.subscriptions[s][r].qos); + node.client.on('message',node.subscriptions[s][r].handler); + } + } + var options = {qos: qos}; + node.client.subscribe(topic, options); + } + } + + // Send any birth message + if (node.birthMessage) { + node.publish(node.birthMessage); + } + }); + node.client.on("reconnect", function() { + for (var id in node.users) { + if (node.users.hasOwnProperty(id)) { + node.users[id].status({fill:"yellow",shape:"ring",text:"node-red:common.status.connecting"}); + } + } + }) + // Register disconnect handlers + node.client.on('close', function () { + if (node.connected) { + node.connected = false; + node.log(RED._("mqtt.state.disconnected",{broker:(node.clientid?node.clientid+"@":"")+node.brokerurl})); + for (var id in node.users) { + if (node.users.hasOwnProperty(id)) { + node.users[id].status({fill:"red",shape:"ring",text:"node-red:common.status.disconnected"}); + } + } + } else if (node.connecting) { + node.log(RED._("mqtt.state.connect-failed",{broker:(node.clientid?node.clientid+"@":"")+node.brokerurl})); + } + }); + + // Register connect error handler + // The client's own reconnect logic will take care of errors + node.client.on('error', function (error) {}); + }catch(err) { + console.log(err); + } } };