From e724f216bff2c3fd22e0e4ad89d82a8b12e63421 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Fri, 30 Sep 2022 13:48:48 +0100 Subject: [PATCH] Fix for CSV undefined property to close #3900 main issue and add tests (other fix is commented out but no tests) --- .../@node-red/nodes/core/parsers/70-CSV.js | 14 +++++++++++--- test/nodes/core/parsers/70-CSV_spec.js | 12 +++++++----- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/packages/node_modules/@node-red/nodes/core/parsers/70-CSV.js b/packages/node_modules/@node-red/nodes/core/parsers/70-CSV.js index 9c55fa2b6..39d03f05c 100644 --- a/packages/node_modules/@node-red/nodes/core/parsers/70-CSV.js +++ b/packages/node_modules/@node-red/nodes/core/parsers/70-CSV.js @@ -110,7 +110,12 @@ module.exports = function(RED) { if (msg.payload[s].hasOwnProperty(p)) { /* istanbul ignore else */ if (typeof msg.payload[s][p] !== "object") { - var q = "" + msg.payload[s][p]; + // Fix to honour include null values flag + //if (typeof msg.payload[s][p] !== "object" || (node.include_null_values === true && msg.payload[s][p] === null)) { + var q = ""; + if (msg.payload[s][p] !== undefined) { + q += msg.payload[s][p]; + } if (q.indexOf(node.quo) !== -1) { // add double quotes if any quotes q = q.replace(/"/g, '""'); ou += node.quo + q + node.quo + node.sep; @@ -130,9 +135,12 @@ module.exports = function(RED) { ou += node.sep; } else { - var p = RED.util.ensureString(RED.util.getMessageProperty(msg,"payload["+s+"]['"+template[t]+"']")); + var p = RED.util.getMessageProperty(msg,"payload["+s+"]['"+template[t]+"']"); /* istanbul ignore else */ - if (p === "undefined") { p = ""; } + if (p === undefined) { p = ""; } + // fix to honour include null values flag + //if (p === null && node.include_null_values !== true) { p = "";} + p = RED.util.ensureString(p); if (p.indexOf(node.quo) !== -1) { // add double quotes if any quotes p = p.replace(/"/g, '""'); ou += node.quo + p + node.quo + node.sep; diff --git a/test/nodes/core/parsers/70-CSV_spec.js b/test/nodes/core/parsers/70-CSV_spec.js index 93d59a171..d56f05db3 100644 --- a/test/nodes/core/parsers/70-CSV_spec.js +++ b/test/nodes/core/parsers/70-CSV_spec.js @@ -693,19 +693,20 @@ describe('CSV node', function() { describe('json object to csv', function() { it('should convert a simple object back to a csv', function(done) { - var flow = [ { id:"n1", type:"csv", temp:"a,b,c,,e,f", wires:[["n2"]] }, + var flow = [ { id:"n1", type:"csv", temp:"a,b,c,,e,f,g,h,i,j,k", wires:[["n2"]] }, {id:"n2", type:"helper"} ]; helper.load(csvNode, flow, function() { var n1 = helper.getNode("n1"); var n2 = helper.getNode("n2"); n2.on("input", function(msg) { + // console.log("GOT",msg) try { - msg.should.have.property('payload', '4,foo,true,,0,"Hello\nWorld"\n'); + msg.should.have.property('payload', '4,foo,true,,0,"Hello\nWorld",,,undefined,null,null\n'); done(); } catch(e) { done(e); } }); - var testJson = { e:0, d:1, b:"foo", c:true, a:4, f:"Hello\nWorld" }; + var testJson = { e:0, d:1, b:"foo", c:true, a:4, f:"Hello\nWorld", h:undefined, i:"undefined",j:null,k:"null" }; n1.emit("input", {payload:testJson}); }); }); @@ -717,13 +718,14 @@ describe('CSV node', function() { var n1 = helper.getNode("n1"); var n2 = helper.getNode("n2"); n2.on("input", function(msg) { + // console.log("GOT",msg) try { - msg.should.have.property('payload', '1,foo,"ba""r","di,ng"\n'); + msg.should.have.property('payload', '1,foo,"ba""r","di,ng",,undefined,null\n'); done(); } catch(e) { done(e); } }); - var testJson = { d:1, b:"foo", c:"ba\"r", a:"di,ng" }; + var testJson = { d:1, b:"foo", c:"ba\"r", a:"di,ng", e:undefined, f:"undefined", g:null,h:"null" }; n1.emit("input", {payload:testJson}); }); });