diff --git a/nodes/core/core/58-debug.html b/nodes/core/core/58-debug.html
index 04aa50789..1d26a4aed 100644
--- a/nodes/core/core/58-debug.html
+++ b/nodes/core/core/58-debug.html
@@ -16,12 +16,15 @@
diff --git a/nodes/core/core/58-debug.js b/nodes/core/core/58-debug.js
index 7436bf2cb..77963d039 100644
--- a/nodes/core/core/58-debug.js
+++ b/nodes/core/core/58-debug.js
@@ -20,40 +20,63 @@ module.exports = function(RED) {
var debuglength = RED.settings.debugMaxLength||1000;
var useColors = false;
// util.inspect.styles.boolean = "red";
-
+
function DebugNode(n) {
RED.nodes.createNode(this,n);
this.name = n.name;
this.complete = n.complete;
this.console = n.console;
- this.active = (n.active == null)||n.active;
+ this.active = (n.active === null || typeof n.active === "undefined") || n.active;
var node = this;
-
+
this.on("input",function(msg) {
- if (this.complete == "true") { // debug complete msg object
- if (this.console == "true") {
+ if (this.complete === "true") {
+ // debug complete msg object
+ if (this.console === "true") {
node.log("\n"+util.inspect(msg, {colors:useColors, depth:10}));
}
if (this.active) {
sendDebug({id:this.id,name:this.name,topic:msg.topic,msg:msg,_path:msg._path});
}
- } else { // debug just the msg.payload
- if (this.console == "true") {
- if (typeof msg.payload === "string") {
- node.log((msg.payload.indexOf("\n") != -1 ? "\n" : "") + msg.payload);
+ } else {
+ // debug user defined msg property
+ var property = "payload";
+ var output = msg[property];
+ if (this.complete !== "false" && typeof this.complete !== "undefined") {
+ property = this.complete;
+ var propertyParts = property.split(".");
+ try {
+ output = propertyParts.reduce(function (obj, i) {
+ return obj[i];
+ }, msg);
+ } catch (err) {
+ node.warn(err);
+ return;
+ }
+
+ if (!output) {
+ node.warn("msg." + this.complete + " does not exist");
+ return;
+ }
+ }
+ if (this.console === "true") {
+ if (typeof output === "string") {
+ node.log((output.indexOf("\n") !== -1 ? "\n" : "") + output);
+ } else if (typeof output === "object") {
+ node.log("\n"+util.inspect(output, {colors:useColors, depth:10}));
+ } else {
+ node.log(util.inspect(output, {colors:useColors}));
}
- else if (typeof msg.payload === "object") { node.log("\n"+util.inspect(msg.payload, {colors:useColors, depth:10})); }
- else { node.log(util.inspect(msg.payload, {colors:useColors})); }
}
if (this.active) {
- sendDebug({id:this.id,name:this.name,topic:msg.topic,msg:msg.payload,_path:msg._path});
+ sendDebug({id:this.id,name:this.name,topic:msg.topic,property:property,msg:output,_path:msg._path});
}
}
});
}
-
+
RED.nodes.registerType("debug",DebugNode);
-
+
function sendDebug(msg) {
if (msg.msg instanceof Error) {
msg.msg = msg.msg.toString();
@@ -75,29 +98,29 @@ module.exports = function(RED) {
msg.msg = "(boolean) "+msg.msg.toString();
} else if (msg.msg === 0) {
msg.msg = "0";
- } else if (msg.msg == null) {
+ } else if (msg.msg === null || typeof msg.msg === "undefined") {
msg.msg = "(undefined)";
}
-
+
if (msg.msg.length > debuglength) {
msg.msg = msg.msg.substr(0,debuglength) +" ....";
}
-
+
RED.comms.publish("debug",msg);
}
-
+
DebugNode.logHandler = new events.EventEmitter();
DebugNode.logHandler.on("log",function(msg) {
- if (msg.level == "warn" || msg.level == "error") {
+ if (msg.level === "warn" || msg.level === "error") {
sendDebug(msg);
}
});
RED.log.addHandler(DebugNode.logHandler);
-
+
RED.httpAdmin.post("/debug/:id/:state", function(req,res) {
var node = RED.nodes.getNode(req.params.id);
var state = req.params.state;
- if (node != null) {
+ if (node !== null && typeof node !== "undefined" ) {
if (state === "enable") {
node.active = true;
res.send(200);
@@ -111,4 +134,4 @@ module.exports = function(RED) {
res.send(404);
}
});
-}
+};
diff --git a/test/nodes/core/core/58-debug_spec.js b/test/nodes/core/core/58-debug_spec.js
index f83fc2ca0..46f4e056d 100644
--- a/test/nodes/core/core/58-debug_spec.js
+++ b/test/nodes/core/core/58-debug_spec.js
@@ -24,7 +24,7 @@ describe('debug node', function() {
before(function(done) {
helper.startServer(done);
});
-
+
afterEach(function() {
helper.unload();
});
@@ -47,7 +47,8 @@ describe('debug node', function() {
n1.emit("input", {payload:"test"});
}, function(msg) {
JSON.parse(msg).should.eql({
- topic:"debug",data:{id:"n1",name:"Debug",msg:"test"}
+ topic:"debug",data:{id:"n1",name:"Debug",msg:"test",
+ property:"payload"}
});
}, done);
});
@@ -69,7 +70,7 @@ describe('debug node', function() {
n1.emit("input", {payload:"test"});
}, function(msg) {
JSON.parse(msg).should.eql({
- topic:"debug",data:{id:"n1",msg:"test"}
+ topic:"debug",data:{id:"n1",msg:"test",property:"payload"}
});
count++;
}, function() {
@@ -95,6 +96,34 @@ describe('debug node', function() {
});
});
+ it('should publish other property', function(done) {
+ var flow = [{id:"n1", type:"debug", complete: "foo" }];
+ helper.load(debugNode, flow, function() {
+ var n1 = helper.getNode("n1");
+ websocket_test(function() {
+ n1.emit("input", {payload:"test", foo:"bar"});
+ }, function(msg) {
+ JSON.parse(msg).should.eql({
+ topic:"debug",data:{id:"n1",msg:"bar",property:"foo"}
+ });
+ }, done);
+ });
+ });
+
+ it('should publish multi-level properties', function(done) {
+ var flow = [{id:"n1", type:"debug", complete: "foo.bar" }];
+ helper.load(debugNode, flow, function() {
+ var n1 = helper.getNode("n1");
+ websocket_test(function() {
+ n1.emit("input", {payload:"test", foo: {bar: "bar"}});
+ }, function(msg) {
+ JSON.parse(msg).should.eql({
+ topic:"debug",data:{id:"n1",msg:"bar",property:"foo.bar"}
+ });
+ }, done);
+ });
+ });
+
it('should publish an Error', function(done) {
var flow = [{id:"n1", type:"debug" }];
helper.load(debugNode, flow, function() {
@@ -103,7 +132,7 @@ describe('debug node', function() {
n1.emit("input", {payload: new Error("oops")});
}, function(msg) {
JSON.parse(msg).should.eql({
- topic:"debug",data:{id:"n1",msg:"Error: oops"}
+ topic:"debug",data:{id:"n1",msg:"Error: oops",property:"payload"}
});
}, done);
});
@@ -117,7 +146,7 @@ describe('debug node', function() {
n1.emit("input", {payload: true});
}, function(msg) {
JSON.parse(msg).should.eql({
- topic:"debug",data:{id:"n1",msg: '(boolean) true'}
+ topic:"debug",data:{id:"n1",msg: '(boolean) true',property:"payload"}
});
}, done);
});
@@ -131,7 +160,7 @@ describe('debug node', function() {
n1.emit("input", {});
}, function(msg) {
JSON.parse(msg).should.eql({
- topic:"debug",data:{id:"n1",msg: '(undefined)'}
+ topic:"debug",data:{id:"n1",msg: '(undefined)',property:"payload"}
});
}, done);
});
@@ -146,7 +175,7 @@ describe('debug node', function() {
}, function(msg) {
JSON.parse(msg).should.eql({
topic:"debug",
- data:{id:"n1",msg:'(Object) {\n "type": "foo"\n}'}
+ data:{id:"n1",msg:'(Object) {\n "type": "foo"\n}',property:"payload"}
});
}, done);
});
@@ -161,7 +190,8 @@ describe('debug node', function() {
}, function(msg) {
JSON.parse(msg).should.eql({
topic:"debug",
- data:{id:"n1",msg: '(Array) [\n 0,\n 1,\n 2,\n 3\n]'}
+ data:{id:"n1",msg: '(Array) [\n 0,\n 1,\n 2,\n 3\n]',
+ property:"payload"}
});
}, done);
});
@@ -180,7 +210,8 @@ describe('debug node', function() {
topic:"debug",
data:{
id:"n1",
- msg:'(Object) {\n "name": "bar",\n "o": "[circular]"\n}'
+ msg:'(Object) {\n "name": "bar",\n "o": "[circular]"\n}',
+ property:"payload"
}
});
}, done);
@@ -198,7 +229,8 @@ describe('debug node', function() {
topic:"debug",
data:{
id:"n1",
- msg: Array(1001).join("X")+' ....'
+ msg: Array(1001).join("X")+' ....',
+ property:"payload"
}
});
}, done);
@@ -217,6 +249,7 @@ describe('debug node', function() {
data:{
id:"n1",
msg: '(Buffer) 48454c4c4f',
+ property:"payload"
}
});
}, done);
@@ -237,7 +270,7 @@ describe('debug node', function() {
});
}, function(msg) {
JSON.parse(msg).should.eql({
- topic:"debug",data:{id:"n1",msg:"message 2"}
+ topic:"debug",data:{id:"n1",msg:"message 2",property:"payload"}
});
}, done);
});