From f103533852134eacc003e52c66f5185313f78744 Mon Sep 17 00:00:00 2001 From: Kazuhito Yokoi Date: Mon, 22 Mar 2021 16:19:55 +0900 Subject: [PATCH] Support typedInput in msg.payload field of exec node --- .../nodes/core/function/90-exec.html | 16 +++++++++++-- .../@node-red/nodes/core/function/90-exec.js | 23 +++++++++++-------- test/nodes/core/function/90-exec_spec.js | 16 +++++++++++++ 3 files changed, 43 insertions(+), 12 deletions(-) diff --git a/packages/node_modules/@node-red/nodes/core/function/90-exec.html b/packages/node_modules/@node-red/nodes/core/function/90-exec.html index 789e15f75..7602866f7 100644 --- a/packages/node_modules/@node-red/nodes/core/function/90-exec.html +++ b/packages/node_modules/@node-red/nodes/core/function/90-exec.html @@ -21,8 +21,10 @@
- -  msg.payload + +   + +
@@ -53,6 +55,8 @@ defaults: { command: {value:""}, addpay: {value:false}, + addpayValue: {value:"payload"}, + addpayValueType: {value:"msg"}, append: {value:""}, useSpawn: {value:"false"}, timer: {value:""}, @@ -79,6 +83,14 @@ if ($("#node-input-useSpawn").val() === null) { $("#node-input-useSpawn").val(this.useSpawn.toString()); } + if ($("#node-input-addpayValue").val() === "") { + $("#node-input-addpayValue").val("payload"); + } + $("#node-input-addpayValue").typedInput({ + default: "msg", + typeField: $("#node-input-addpayValueType"), + types: ["msg"] + }); } }); diff --git a/packages/node_modules/@node-red/nodes/core/function/90-exec.js b/packages/node_modules/@node-red/nodes/core/function/90-exec.js index 132286cb4..5b94d9258 100644 --- a/packages/node_modules/@node-red/nodes/core/function/90-exec.js +++ b/packages/node_modules/@node-red/nodes/core/function/90-exec.js @@ -26,6 +26,8 @@ module.exports = function(RED) { this.cmd = (n.command || "").trim(); if (n.addpay === undefined) { n.addpay = true; } this.addpay = n.addpay; + this.addpayValue = n.addpayValue || "payload"; + this.addpayValueType = n.addpayValueType || "msg"; this.append = (n.append || "").trim(); this.useSpawn = (n.useSpawn == "true"); this.timer = Number(n.timer || 0)*1000; @@ -61,12 +63,16 @@ module.exports = function(RED) { } else { var child; + // make the extra args into an array + // then prepend with the msg.payload + var arg = node.cmd; + if (node.addpay) { + if (node.addpayValueType === "msg" && msg.hasOwnProperty(node.addpayValue)) { + arg += " " + RED.util.getMessageProperty(msg, node.addpayValue); + } + } + if (node.append.trim() !== "") { arg += " " + node.append; } if (this.useSpawn === true) { - // make the extra args into an array - // then prepend with the msg.payload - var arg = node.cmd; - if ((node.addpay === true) && msg.hasOwnProperty("payload")) { arg += " "+msg.payload; } - if (node.append.trim() !== "") { arg += " "+node.append; } // slice whole line by spaces and removes any quotes since spawn can't handle them arg = arg.match(/(?:[^\s"]+|"[^"]*")+/g).map((a) => { if (/^".*"$/.test(a)) { @@ -126,12 +132,9 @@ module.exports = function(RED) { }); } else { - var cl = node.cmd; - if ((node.addpay === true) && msg.hasOwnProperty("payload")) { cl += " "+msg.payload; } - if (node.append.trim() !== "") { cl += " "+node.append; } /* istanbul ignore else */ - if (RED.settings.verbose) { node.log(cl); } - child = exec(cl, node.execOpt, function (error, stdout, stderr) { + if (RED.settings.verbose) { node.log(arg); } + child = exec(arg, node.execOpt, function (error, stdout, stderr) { var msg2, msg3; delete msg.payload; if (stderr) { diff --git a/test/nodes/core/function/90-exec_spec.js b/test/nodes/core/function/90-exec_spec.js index 6dbe8137d..c74c716c6 100644 --- a/test/nodes/core/function/90-exec_spec.js +++ b/test/nodes/core/function/90-exec_spec.js @@ -114,6 +114,22 @@ describe('exec node', function() { }); }); + it('should exec a simple command with appended value from message', function (done) { + var flow = [{id:"n1", type:"exec", wires:[["n2"]], command:"echo", addpay:true, addpayValue:"topic", addpayValueType:"msg", append:"more", oldrc:"false"}, + {id:"n2", type:"helper"}]; + helper.load(execNode, flow, function () { + var n1 = helper.getNode("n1"); + var n2 = helper.getNode("n2"); + n2.on("input", function (msg) { + msg.should.have.property("payload"); + msg.payload.should.be.a.String(); + msg.payload.should.equal("bar more\n"); + done(); + }); + n1.receive({payload:"foo", topic:"bar"}); + }); + }); + it('should exec a simple command with extra parameters', function(done) { var flow = [{id:"n1",type:"exec",wires:[["n2"],["n3"],["n4"]],command:"echo", addpay:true, append:"more", oldrc:"false"}, {id:"n2", type:"helper"},{id:"n3", type:"helper"},{id:"n4", type:"helper"}];