From e5a8cd2425a6ad68bcb61162589dbe6d89248616 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E0=A4=95=E0=A4=BE=E0=A4=B0=E0=A4=A4=E0=A5=8B=E0=A4=AB?= =?UTF-8?q?=E0=A5=8D=E0=A4=AB=E0=A5=87=E0=A4=B2=E0=A4=B8=E0=A5=8D=E0=A4=95?= =?UTF-8?q?=E0=A5=8D=E0=A4=B0=E0=A4=BF=E0=A4=AA=E0=A5=8D=E0=A4=9F=E2=84=A2?= Date: Fri, 16 Feb 2024 11:37:12 +0100 Subject: [PATCH] fix(FTP Node): Fix "Maximum call stack size exceeded" error when dealing with too many files --- packages/nodes-base/nodes/Ftp/Ftp.node.ts | 67 ++++++++++------------- 1 file changed, 30 insertions(+), 37 deletions(-) diff --git a/packages/nodes-base/nodes/Ftp/Ftp.node.ts b/packages/nodes-base/nodes/Ftp/Ftp.node.ts index 19e8f2cff1b22..5bd0b8125136c 100644 --- a/packages/nodes-base/nodes/Ftp/Ftp.node.ts +++ b/packages/nodes-base/nodes/Ftp/Ftp.node.ts @@ -502,9 +502,7 @@ export class Ftp implements INodeType { async execute(this: IExecuteFunctions): Promise { const items = this.getInputData(); - // const returnData: IDataObject[] = []; - const returnItems: INodeExecutionData[] = []; - let responseData; + let returnItems: INodeExecutionData[] = []; const operation = this.getNodeParameter('operation', 0); let credentials: ICredentialDataDecryptedObject | undefined = undefined; @@ -569,22 +567,19 @@ export class Ftp implements INodeType { const recursive = this.getNodeParameter('recursive', i) as boolean; + let responseData: sftpClient.FileInfo[]; if (recursive) { responseData = await callRecursiveList(path, sftp!, normalizeSFtpItem); - const executionData = this.helpers.constructExecutionMetaData( - this.helpers.returnJsonArray(responseData as unknown as IDataObject[]), - { itemData: { item: i } }, - ); - returnItems.push.apply(returnItems, executionData); } else { responseData = await sftp!.list(path); responseData.forEach((item) => normalizeSFtpItem(item, path)); - const executionData = this.helpers.constructExecutionMetaData( - this.helpers.returnJsonArray(responseData as unknown as IDataObject[]), - { itemData: { item: i } }, - ); - returnItems.push.apply(returnItems, executionData); } + + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray(responseData as unknown as IDataObject[]), + { itemData: { item: i } }, + ); + returnItems = returnItems.concat(executionData); } if (operation === 'delete') { @@ -592,15 +587,15 @@ export class Ftp implements INodeType { const options = this.getNodeParameter('options', i); if (options.folder === true) { - responseData = await sftp!.rmdir(path, !!options.recursive); + await sftp!.rmdir(path, !!options.recursive); } else { - responseData = await sftp!.delete(path); + await sftp!.delete(path); } const executionData = this.helpers.constructExecutionMetaData( [{ json: { success: true } }], { itemData: { item: i } }, ); - returnItems.push(...executionData); + returnItems = returnItems.concat(executionData); } if (operation === 'rename') { @@ -614,12 +609,12 @@ export class Ftp implements INodeType { await recursivelyCreateSftpDirs(sftp!, newPath); } - responseData = await sftp!.rename(oldPath, newPath); + await sftp!.rename(oldPath, newPath); const executionData = this.helpers.constructExecutionMetaData( [{ json: { success: true } }], { itemData: { item: i } }, ); - returnItems.push(...executionData); + returnItems = returnItems.concat(executionData); } if (operation === 'download') { @@ -640,7 +635,7 @@ export class Ftp implements INodeType { this.helpers.returnJsonArray(items[i]), { itemData: { item: i } }, ); - returnItems.push(...executionData); + returnItems = returnItems.concat(executionData); } finally { await binaryFile.cleanup(); } @@ -671,7 +666,7 @@ export class Ftp implements INodeType { this.helpers.returnJsonArray(items[i]), { itemData: { item: i } }, ); - returnItems.push(...executionData); + returnItems = returnItems.concat(executionData); } } @@ -681,24 +676,21 @@ export class Ftp implements INodeType { const recursive = this.getNodeParameter('recursive', i) as boolean; + let responseData; if (recursive) { responseData = await callRecursiveList(path, ftp!, normalizeFtpItem); - const executionData = this.helpers.constructExecutionMetaData( - this.helpers.returnJsonArray(responseData as unknown as IDataObject[]), - { itemData: { item: i } }, - ); - returnItems.push.apply(returnItems, executionData); } else { responseData = await ftp!.list(path); responseData.forEach((item) => normalizeFtpItem(item as ftpClient.ListingElement, path), ); - const executionData = this.helpers.constructExecutionMetaData( - this.helpers.returnJsonArray(responseData as unknown as IDataObject[]), - { itemData: { item: i } }, - ); - returnItems.push.apply(returnItems, executionData); } + + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray(responseData as unknown as IDataObject[]), + { itemData: { item: i } }, + ); + returnItems = returnItems.concat(executionData); } if (operation === 'delete') { @@ -706,15 +698,16 @@ export class Ftp implements INodeType { const options = this.getNodeParameter('options', i); if (options.folder === true) { - responseData = await ftp!.rmdir(path, !!options.recursive); + await ftp!.rmdir(path, !!options.recursive); } else { - responseData = await ftp!.delete(path); + await ftp!.delete(path); } + const executionData = this.helpers.constructExecutionMetaData( [{ json: { success: true } }], { itemData: { item: i } }, ); - returnItems.push(...executionData); + returnItems = returnItems.concat(executionData); } if (operation === 'download') { @@ -736,7 +729,7 @@ export class Ftp implements INodeType { this.helpers.returnJsonArray(items[i]), { itemData: { item: i } }, ); - returnItems.push(...executionData); + returnItems = returnItems.concat(executionData); } finally { await binaryFile.cleanup(); } @@ -747,12 +740,12 @@ export class Ftp implements INodeType { const newPath = this.getNodeParameter('newPath', i) as string; - responseData = await ftp!.rename(oldPath, newPath); + await ftp!.rename(oldPath, newPath); const executionData = this.helpers.constructExecutionMetaData( [{ json: { success: true } }], { itemData: { item: i } }, ); - returnItems.push(...executionData); + returnItems = returnItems.concat(executionData); } if (operation === 'upload') { @@ -801,7 +794,7 @@ export class Ftp implements INodeType { this.helpers.returnJsonArray(items[i]), { itemData: { item: i } }, ); - returnItems.push(...executionData); + returnItems = returnItems.concat(executionData); } } }