diff --git a/nodes/core/parsers/70-CSV.js b/nodes/core/parsers/70-CSV.js index ff272db41..d7ef7ed50 100644 --- a/nodes/core/parsers/70-CSV.js +++ b/nodes/core/parsers/70-CSV.js @@ -174,12 +174,7 @@ module.exports = function(RED) { o[node.template[j]] = k[j]; } if (JSON.stringify(o) !== "{}") { // don't send empty objects - if (node.multi === "one") { - var newMessage = RED.util.cloneMessage(msg); - newMessage.payload = o; - node.send(newMessage); // either send - } - else { a.push(o); } // or add to the array + a.push(o); // add to the array } j = 0; k = [""]; @@ -200,17 +195,28 @@ module.exports = function(RED) { o[node.template[j]] = k[j]; } if (JSON.stringify(o) !== "{}") { // don't send empty objects - if (node.multi === "one") { - var newMessage = RED.util.cloneMessage(msg); - newMessage.payload = o; - node.send(newMessage); // either send - } - else { a.push(o); } // or add to the aray + a.push(o); // add to the aray } if (node.multi !== "one") { msg.payload = a; node.send(msg); // finally send the array } + else { + var has_parts = msg.hasOwnProperty("parts"); + var len = a.length; + for(var i = 0; i < len; i++) { + var newMessage = RED.util.cloneMessage(msg); + newMessage.payload = a[i]; + if(!has_parts) { + newMessage.parts = { + id: msg._msgid, + index: i, + count: len + }; + } + node.send(newMessage); + } + } } catch(e) { node.error(e,msg); } } diff --git a/test/nodes/core/parsers/70-CSV_spec.js b/test/nodes/core/parsers/70-CSV_spec.js index a664d0eab..63a598117 100644 --- a/test/nodes/core/parsers/70-CSV_spec.js +++ b/test/nodes/core/parsers/70-CSV_spec.js @@ -46,6 +46,23 @@ describe('CSV node', function() { }); describe('csv to json', function() { + var parts_id = undefined; + + afterEach(function() { + parts_id = undefined; + }); + + function check_parts(msg, index, count) { + msg.should.have.property('parts'); + if(parts_id === undefined) { + parts_id = msg.parts.id; + } + else { + msg.parts.should.have.property('id', parts_id); + } + msg.parts.should.have.property('index', index); + msg.parts.should.have.property('count', count); + } it('should convert a simple csv string to a javascript object', function(done) { var flow = [ { id:"n1", type:"csv", temp:"a,b,c,d", wires:[["n2"]] }, @@ -55,6 +72,7 @@ describe('CSV node', function() { var n2 = helper.getNode("n2"); n2.on("input", function(msg) { msg.should.have.property('payload', { a: 1, b: 2, c: 3, d: 4 }); + check_parts(msg, 0, 1); done(); }); var testString = "1,2,3,4"+String.fromCharCode(10); @@ -70,6 +88,7 @@ describe('CSV node', function() { var n2 = helper.getNode("n2"); n2.on("input", function(msg) { msg.should.have.property('payload', { a: 1, b: 2, c: 3, d: 4 }); + check_parts(msg, 0, 1); done(); }); var testString = "1,2,3,4"+String.fromCharCode(10); @@ -85,6 +104,7 @@ describe('CSV node', function() { var n2 = helper.getNode("n2"); n2.on("input", function(msg) { msg.should.have.property('payload', { col1: 1, col2: 2, col3: 3, col4: 4 }); + check_parts(msg, 0, 1); done(); }); var testString = "1,2,3,4"+String.fromCharCode(10); @@ -100,6 +120,7 @@ describe('CSV node', function() { var n2 = helper.getNode("n2"); n2.on("input", function(msg) { msg.should.have.property('payload', { a: 1, d: 4 }); + check_parts(msg, 0, 1); done(); }); var testString = "1,2,3,4"+String.fromCharCode(10); @@ -117,6 +138,7 @@ describe('CSV node', function() { n2.on("input", function(msg) { //console.log(msg); msg.should.have.property('payload', { a: 1, b: -2, c: '+3', d: 4, e: -5, f: 'ab"cd', g: 'with,a,comma' }); + check_parts(msg, 0, 1); done(); }); var testString = '"1","-2","+3","04","-05","ab""cd","with,a,comma"'+String.fromCharCode(10); @@ -134,6 +156,7 @@ describe('CSV node', function() { //console.log(msg); msg.should.have.property('payload', { a: "with,an", b: "odd,number", c: "ofquotes" }); //msg.should.have.property('payload', { a: 1, b: -2, c: '+3', d: 4, e: -5, f: 'ab"cd', g: 'with,a,comma' }); + check_parts(msg, 0, 1); done(); }); var testString = '"with,a"n,odd","num"ber","of"qu"ot"es"'+String.fromCharCode(10); @@ -152,10 +175,12 @@ describe('CSV node', function() { //console.log(msg); if (c === 0) { msg.should.have.property('payload', { w: 1, x: 2, y: 3, z: 4 }); + check_parts(msg, 0, 2); c += 1; } else { msg.should.have.property('payload', { w: 5, x: 6, y: 7, z: 8 }); + check_parts(msg, 1, 2); done(); } }); @@ -172,6 +197,7 @@ describe('CSV node', function() { var n2 = helper.getNode("n2"); n2.on("input", function(msg) { msg.should.have.property('payload', [ { a: 1, b: 2, c: 3, d: 4 },{ a: 5, b: -6, c: 7, d: '+8' },{ a: 9, b: 0, c: 'a', d: 'b' },{ a: 'c', b: 'd', c: 'e', d: 'f' } ]); + msg.should.not.have.property('parts'); done(); }); var testString = "1,2,3,4\n5,-6,07,+8\n9,0,a,b\nc,d,e,f"; @@ -187,12 +213,30 @@ describe('CSV node', function() { var n2 = helper.getNode("n2"); n2.on("input", function(msg) { msg.should.have.property('payload', { a: "a", b: "127.0.0.1", c: 56.7, d: -32.8, e: "+76.22C" }); + check_parts(msg, 0, 1); done(); }); var testString = "a,127.0.0.1,56.7,-32.8,+76.22C"; n1.emit("input", {payload:testString}); }); }); + + it('should preserve parts property', function(done) { + var flow = [ { id:"n1", type:"csv", temp:"a,b,c,d", 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) { + msg.should.have.property('payload', { a: 1, b: 2, c: 3, d: 4 }); + check_parts(msg, 3, 4); + done(); + }); + var testString = "1,2,3,4"+String.fromCharCode(10); + n1.emit("input", {payload:testString, parts: {id:"X", index:3, count:4} }); + }); + }); + }); describe('json object to csv', function() {