From 1868289b7127e372be9b2eb72e61240e89be2b53 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Tue, 25 Feb 2020 22:15:53 +0000 Subject: [PATCH] Better fix for trigegr 2nd message in last payload mode Now works correctly in multiple topics mode. And update tests --- .../nodes/core/function/89-trigger.js | 15 +++++--- test/nodes/core/function/89-trigger_spec.js | 35 +++++++++++++++++++ 2 files changed, 45 insertions(+), 5 deletions(-) diff --git a/packages/node_modules/@node-red/nodes/core/function/89-trigger.js b/packages/node_modules/@node-red/nodes/core/function/89-trigger.js index a068550e2..4debeacde 100644 --- a/packages/node_modules/@node-red/nodes/core/function/89-trigger.js +++ b/packages/node_modules/@node-red/nodes/core/function/89-trigger.js @@ -76,6 +76,7 @@ module.exports = function(RED) { var node = this; node.topics = {}; + var npay = {}; var pendingMessages = []; var activeMessagePromise = null; var processMessageQueue = function(msg) { @@ -106,9 +107,7 @@ module.exports = function(RED) { }); } - var npay; this.on('input', function(msg) { - if (node.op2type === "payl") { npay = RED.util.cloneMessage(msg); } processMessageQueue(msg); }); @@ -124,6 +123,7 @@ module.exports = function(RED) { node.status({}); } else { + if (node.op2type === "payl") { npay[topic] = RED.util.cloneMessage(msg); } if (((!node.topics[topic].tout) && (node.topics[topic].tout !== 0)) || (node.loop === true)) { promise = Promise.resolve(); if (node.op2type === "pay") { node.topics[topic].m2 = RED.util.cloneMessage(msg.payload); } @@ -188,10 +188,15 @@ module.exports = function(RED) { }); } promise.then(() => { - msg2.payload = node.topics[topic].m2; + if (node.op2type === "payl") { + node.send(npay[topic]); + delete npay[topic]; + } + else { + msg2.payload = node.topics[topic].m2; + node.send(msg2); + } delete node.topics[topic]; - if (node.op2type === "payl") { node.send(npay); } - else { node.send(msg2); } node.status({}); }).catch(err => { node.error(err); diff --git a/test/nodes/core/function/89-trigger_spec.js b/test/nodes/core/function/89-trigger_spec.js index be0094ccf..7d7450580 100644 --- a/test/nodes/core/function/89-trigger_spec.js +++ b/test/nodes/core/function/89-trigger_spec.js @@ -759,6 +759,41 @@ describe('trigger node', function() { }); }); + it('should be able output the 2nd payload and handle multiple topics', function(done) { + var flow = [{"id":"n1", "type":"trigger", "name":"triggerNode", extend:"false", op1type:"nul", op2type:"payl", op1:"false", op2:"true", duration:"80", bytopic:"topic", wires:[["n2"]] }, + {id:"n2", type:"helper"} ]; + helper.load(triggerNode, flow, function() { + var n1 = helper.getNode("n1"); + var n2 = helper.getNode("n2"); + var c = 0; + n2.on("input", function(msg) { + try { + if (c === 0) { + msg.should.have.a.property("payload", "Goodbye1"); + msg.should.have.a.property("topic", "test1"); + c += 1; + } + else { + msg.should.have.a.property("payload", "Goodbye2"); + msg.should.have.a.property("topic", "test2"); + done(); + } + } + catch(err) { done(err); } + }); + n1.emit("input", {payload:"Hello1", topic:"test1"}); + setTimeout( function() { + n1.emit("input", {payload:"Hello2", topic:"test2"}); + },20); + setTimeout( function() { + n1.emit("input", {payload:"Goodbye2", topic:"test2"}); + },20); + setTimeout( function() { + n1.emit("input", {payload:"Goodbye1", topic:"test1"}); + },20); + }); + }); + it('should be able to apply mustache templates to payloads', function(done) { var flow = [{"id":"n1", "type":"trigger", "name":"triggerNode", op1type:"val", op2type:"val", op1:"{{payload}}", op2:"{{topic}}", duration:"50", wires:[["n2"]] }, {id:"n2", type:"helper"} ];