From 66a667fe585722875c267b76e99cf981d94e47ce Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Thu, 9 May 2024 16:48:51 +0100 Subject: [PATCH 1/2] Pass full error object in Function node and copy over cause property Fixes #4683 --- .../@node-red/nodes/core/function/10-function.js | 15 ++++++++------- .../@node-red/runtime/lib/flows/Flow.js | 3 +++ 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/packages/node_modules/@node-red/nodes/core/function/10-function.js b/packages/node_modules/@node-red/nodes/core/function/10-function.js index a915a1623..580b115f0 100644 --- a/packages/node_modules/@node-red/nodes/core/function/10-function.js +++ b/packages/node_modules/@node-red/nodes/core/function/10-function.js @@ -438,10 +438,9 @@ module.exports = function(RED) { //store the error in msg to be used in flows msg.error = err; - - var line = 0; - var errorMessage; if (stack.length > 0) { + let line = 0; + let errorMessage; while (line < stack.length && stack[line].indexOf("ReferenceError") !== 0) { line++; } @@ -455,11 +454,13 @@ module.exports = function(RED) { errorMessage += " (line "+lineno+", col "+cha+")"; } } + if (errorMessage) { + err.message = errorMessage + } } - if (!errorMessage) { - errorMessage = err.toString(); - } - done(errorMessage); + // Pass the whole error object so any additional properties + // (such as cause) are preserved + done(err); } else if (typeof err === "string") { done(err); diff --git a/packages/node_modules/@node-red/runtime/lib/flows/Flow.js b/packages/node_modules/@node-red/runtime/lib/flows/Flow.js index dd3d335a2..c4f4e39a2 100644 --- a/packages/node_modules/@node-red/runtime/lib/flows/Flow.js +++ b/packages/node_modules/@node-red/runtime/lib/flows/Flow.js @@ -678,6 +678,9 @@ class Flow { if (logMessage.hasOwnProperty('stack')) { errorMessage.error.stack = logMessage.stack; } + if (logMessage.hasOwnProperty('cause')) { + errorMessage.error.cause = logMessage.cause; + } targetCatchNode.receive(errorMessage); handled = true; }); From 03648dc7e84ae6cc6c9c3b93659cc960eb6b5e9a Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Thu, 9 May 2024 17:25:47 +0100 Subject: [PATCH 2/2] Update tests for changed function node low-level output --- test/nodes/core/function/10-function_spec.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/test/nodes/core/function/10-function_spec.js b/test/nodes/core/function/10-function_spec.js index acb693208..371c810d9 100644 --- a/test/nodes/core/function/10-function_spec.js +++ b/test/nodes/core/function/10-function_spec.js @@ -390,7 +390,8 @@ describe('function node', function() { msg.should.have.property('level', helper.log().ERROR); msg.should.have.property('id', 'n1'); msg.should.have.property('type', 'function'); - msg.should.have.property('msg', 'ReferenceError: retunr is not defined (line 2, col 1)'); + msg.should.have.property('msg') + msg.msg.message.should.equal('ReferenceError: retunr is not defined (line 2, col 1)'); done(); } catch(err) { done(err); @@ -659,7 +660,8 @@ describe('function node', function() { msg.should.have.property('level', helper.log().ERROR); msg.should.have.property('id', name); msg.should.have.property('type', 'function'); - msg.should.have.property('msg', 'Error: Callback must be a function'); + msg.should.have.property('msg') + msg.msg.message.should.equal('Callback must be a function'); done(); } catch (e) {