From 5945be95cfb8554cb5fde5fc54fcad78b1b713fe Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Thu, 2 Mar 2017 14:02:26 +0000 Subject: [PATCH] Treat missing msg properties as undefined rather than throw error Fixes #1167 --- nodes/core/logic/10-switch.js | 12 ++++++++++-- test/nodes/core/logic/10-switch_spec.js | 26 +++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/nodes/core/logic/10-switch.js b/nodes/core/logic/10-switch.js index 3cf429a1e..1eeffdd47 100644 --- a/nodes/core/logic/10-switch.js +++ b/nodes/core/logic/10-switch.js @@ -125,7 +125,11 @@ module.exports = function(RED) { return; } } else { - v1 = RED.util.evaluateNodeProperty(rule.v,rule.vt,node,msg); + try { + v1 = RED.util.evaluateNodeProperty(rule.v,rule.vt,node,msg); + } catch(err) { + v1 = undefined; + } } v2 = rule.v2; if (rule.v2t === 'prev') { @@ -138,7 +142,11 @@ module.exports = function(RED) { return; } } else if (typeof v2 !== 'undefined') { - v2 = RED.util.evaluateNodeProperty(rule.v2,rule.v2t,node,msg); + try { + v2 = RED.util.evaluateNodeProperty(rule.v2,rule.v2t,node,msg); + } catch(err) { + v2 = undefined; + } } if (rule.t == "else") { test = elseflag; elseflag = true; } if (operators[rule.t](test,v1,v2,rule.case)) { diff --git a/test/nodes/core/logic/10-switch_spec.js b/test/nodes/core/logic/10-switch_spec.js index 03e48ee7d..8e8868038 100644 --- a/test/nodes/core/logic/10-switch_spec.js +++ b/test/nodes/core/logic/10-switch_spec.js @@ -347,6 +347,32 @@ describe('switch Node', function() { switchNode1.receive({payload:undefined}); }); }); + it('should treat non-existant msg property conditional as undefined', function(done) { + var flow = [{"id":"switchNode1","type":"switch","z":"feee1df.c3263e","name":"","property":"payload","propertyType":"msg","rules":[{"t":"eq","v":"this.does.not.exist","vt":"msg"}],"checkall":"true","outputs":1,"x":190,"y":440,"wires":[["helperNode1"]]}, + {id:"helperNode1", type:"helper", wires:[]}]; + + helper.load(switchNode, flow, function() { + var switchNode1 = helper.getNode("switchNode1"); + var helperNode1 = helper.getNode("helperNode1"); + var received = []; + helperNode1.on("input", function(msg) { + received.push(msg); + }); + // First message should be dropped as payload is not undefined + switchNode1.receive({topic:"messageOne",payload:""}); + // Second message should pass through as payload is undefined + switchNode1.receive({topic:"messageTwo",payload:undefined}); + setTimeout(function() { + try { + received.should.have.lengthOf(1); + received[0].should.have.a.property("topic","messageTwo"); + done(); + } catch(err) { + done(err); + } + },100) + }); + }); it('should check if input is indeed not null', function(done) { var flow = [{id:"switchNode1",type:"switch",name:"switchNode",property:"payload",rules:[{"t":"nnull"}],checkall:false,outputs:1,wires:[["helperNode1"]]},