diff --git a/packages/nodes-base/nodes/Function/Function.node.ts b/packages/nodes-base/nodes/Function/Function.node.ts index 649ec70ee9..0ce45f9f1a 100644 --- a/packages/nodes-base/nodes/Function/Function.node.ts +++ b/packages/nodes-base/nodes/Function/Function.node.ts @@ -1,5 +1,6 @@ import { IExecuteFunctions } from 'n8n-core'; import { + IDataObject, INodeExecutionData, INodeType, INodeTypeDescription, @@ -58,6 +59,21 @@ return items;`, // Copy the items as they may get changed in the functions items = JSON.parse(JSON.stringify(items)); + const cleanupData = (inputData: IDataObject): IDataObject => { + Object.keys(inputData).map(key => { + if (inputData[key] !== null && typeof inputData[key] === 'object') { + if (inputData[key]!.constructor.name === 'Object') { + // Is regular node.js object so check its data + inputData[key] = cleanupData(inputData[key] as IDataObject); + } else { + // Is some special object like a Date so stringify + inputData[key] = JSON.parse(JSON.stringify(inputData[key])); + } + } + }); + return inputData; + }; + // Define the global objects for the custom function const sandbox = { getNodeParameter: this.getNodeParameter, @@ -117,6 +133,9 @@ return items;`, if (typeof item.json !== 'object') { throw new NodeOperationError(this.getNode(), 'The json-property has to be an object!'); } + + item.json = cleanupData(item.json); + if (item.binary !== undefined) { if (Array.isArray(item.binary) || typeof item.binary !== 'object') { throw new NodeOperationError(this.getNode(), 'The binary-property has to be an object!'); @@ -143,9 +162,6 @@ return items;`, } } - - - return this.prepareOutputData(items); } } diff --git a/packages/nodes-base/nodes/FunctionItem/FunctionItem.node.ts b/packages/nodes-base/nodes/FunctionItem/FunctionItem.node.ts index 2ae9fba283..da582fdabb 100644 --- a/packages/nodes-base/nodes/FunctionItem/FunctionItem.node.ts +++ b/packages/nodes-base/nodes/FunctionItem/FunctionItem.node.ts @@ -58,6 +58,21 @@ return item;`, const length = items.length as unknown as number; let item: INodeExecutionData; + const cleanupData = (inputData: IDataObject): IDataObject => { + Object.keys(inputData).map(key => { + if (inputData[key] !== null && typeof inputData[key] === 'object') { + if (inputData[key]!.constructor.name === 'Object') { + // Is regular node.js object so check its data + inputData[key] = cleanupData(inputData[key] as IDataObject); + } else { + // Is some special object like a Date so stringify + inputData[key] = JSON.parse(JSON.stringify(inputData[key])); + } + } + }); + return inputData; + }; + for (let itemIndex = 0; itemIndex < length; itemIndex++) { try { item = items[itemIndex]; @@ -145,7 +160,7 @@ return item;`, } const returnItem: INodeExecutionData = { - json: jsonData, + json: cleanupData(jsonData), }; if (item.binary) {