diff --git a/packages/core/src/execution-engine/__tests__/workflow-execute.test.ts b/packages/core/src/execution-engine/__tests__/workflow-execute.test.ts index 97ba4ac170e..089ad0180ad 100644 --- a/packages/core/src/execution-engine/__tests__/workflow-execute.test.ts +++ b/packages/core/src/execution-engine/__tests__/workflow-execute.test.ts @@ -1789,6 +1789,43 @@ describe('WorkflowExecute', () => { ]); }); + test.each([ + { + name: 'details', + json: { error: 'Error occurred', details: { httpCode: '500' } }, + }, + { + name: 'message and details', + json: { + error: 'Error occurred', + message: 'Error details', + details: { httpCode: '500' }, + }, + }, + ])('should handle error in json with $name properties', ({ json }) => { + const nodeSuccessData: INodeExecutionData[][] = [ + [ + { + json, + pairedItem: { item: 0, input: 0 }, + }, + ], + ]; + + workflowExecute.handleNodeErrorOutput(workflow, executionData, nodeSuccessData, 0); + + expect(nodeSuccessData[0]).toEqual([]); + expect(nodeSuccessData[1]).toEqual([ + { + json: { + ...json, + someData: 'test', + }, + pairedItem: { item: 0, input: 0 }, + }, + ]); + }); + test('should preserve pairedItem data when routing errors', () => { const nodeSuccessData: INodeExecutionData[][] = [ [ diff --git a/packages/core/src/execution-engine/workflow-execute.ts b/packages/core/src/execution-engine/workflow-execute.ts index da6dd6ca6b3..cc797c7ffa9 100644 --- a/packages/core/src/execution-engine/workflow-execute.ts +++ b/packages/core/src/execution-engine/workflow-execute.ts @@ -2755,9 +2755,10 @@ export class WorkflowExecute { let errorData: GenericValue | undefined; if (item.error) { errorData = item.error; - } else if (item.json.error && Object.keys(item.json).length === 1) { - errorData = item.json.error; - } else if (item.json.error && item.json.message && Object.keys(item.json).length === 2) { + } else if ( + item.json.error && + Object.keys(item.json).every((key) => ['error', 'message', 'details'].includes(key)) + ) { errorData = item.json.error; } diff --git a/packages/nodes-base/nodes/HttpRequest/test/node/HttpRequestV3.test.ts b/packages/nodes-base/nodes/HttpRequest/test/node/HttpRequestV3.test.ts index f8b768216be..aeb18c5245d 100644 --- a/packages/nodes-base/nodes/HttpRequest/test/node/HttpRequestV3.test.ts +++ b/packages/nodes-base/nodes/HttpRequest/test/node/HttpRequestV3.test.ts @@ -783,6 +783,7 @@ describe('HttpRequestV3', () => { }, pairedItem: { item: 0 }, }); + expect(Object.keys(result[0][0].json)).toEqual(['error', 'details']); }, ); diff --git a/packages/workflow/src/interfaces.ts b/packages/workflow/src/interfaces.ts index a0cdc061e9d..fc66e74183e 100644 --- a/packages/workflow/src/interfaces.ts +++ b/packages/workflow/src/interfaces.ts @@ -1702,6 +1702,10 @@ export interface INodeExecutionData { | number | string | undefined; + /** + * JSON output. + * In `continueErrorOutput` mode, engine will try to read item.error or fallback to item.json.error with allowed optional keys: message, details. + */ json: IDataObject; binary?: IBinaryKeyData; error?: NodeApiError | NodeOperationError;