From 270328ccf6e5502adc092f6f85d146ffb98e1208 Mon Sep 17 00:00:00 2001 From: Michael Kret <88898367+michael-radency@users.noreply.github.com> Date: Thu, 4 Jan 2024 17:11:16 +0200 Subject: [PATCH] feat(HTTP Request Node): Interval Between Requests option for pagination (#8224) ## Summary Option to add delay between request when using pagination ![image](https://github.com/n8n-io/n8n/assets/88898367/df93f9c7-2569-4d22-a719-494d9dfe8030) ## Related tickets and issues https://linear.app/n8n/issue/NODE-1029/http-request-pagination-feature-doesnt-use-batch-settings https://github.com/n8n-io/n8n/issues/8062 --- packages/core/src/NodeExecuteFunctions.ts | 4 ++++ .../HttpRequest/V3/HttpRequestV3.node.ts | 19 +++++++++++++++++++ packages/workflow/src/Interfaces.ts | 1 + 3 files changed, 24 insertions(+) diff --git a/packages/core/src/NodeExecuteFunctions.ts b/packages/core/src/NodeExecuteFunctions.ts index 2c014c6487..f43bac3889 100644 --- a/packages/core/src/NodeExecuteFunctions.ts +++ b/packages/core/src/NodeExecuteFunctions.ts @@ -115,6 +115,7 @@ import { ExecutionBaseError, jsonParse, ApplicationError, + sleep, } from 'n8n-workflow'; import type { Token } from 'oauth-1.0a'; import clientOAuth1 from 'oauth-1.0a'; @@ -2748,6 +2749,9 @@ const getRequestHelperFunctions = ( ) as boolean; if (makeAdditionalRequest) { + if (paginationOptions.requestInterval) { + await sleep(paginationOptions.requestInterval); + } if (tempResponseData.statusCode < 200 || tempResponseData.statusCode >= 300) { // We have it configured to let all requests pass no matter the response code // via "requestOptions.simple = false" to not by default fail if it is for example diff --git a/packages/nodes-base/nodes/HttpRequest/V3/HttpRequestV3.node.ts b/packages/nodes-base/nodes/HttpRequest/V3/HttpRequestV3.node.ts index fdb304083b..3ccf4b55f9 100644 --- a/packages/nodes-base/nodes/HttpRequest/V3/HttpRequestV3.node.ts +++ b/packages/nodes-base/nodes/HttpRequest/V3/HttpRequestV3.node.ts @@ -1143,6 +1143,23 @@ export class HttpRequestV3 implements INodeType { default: 100, description: 'Maximum amount of request to be make', }, + { + // eslint-disable-next-line n8n-nodes-base/node-param-display-name-miscased + displayName: 'Interval Between Requests (ms)', + name: 'requestInterval', + type: 'number', + displayOptions: { + hide: { + paginationMode: ['off'], + }, + }, + default: 0, + description: 'Time in milliseconds to wait between requests', + hint: 'At 0 no delay will be added', + typeOptions: { + minValue: 0, + }, + }, ], }, ], @@ -1272,6 +1289,7 @@ export class HttpRequestV3 implements INodeType { completeExpression: string; limitPagesFetched: boolean; maxRequests: number; + requestInterval: number; }; for (let itemIndex = 0; itemIndex < items.length; itemIndex++) { @@ -1653,6 +1671,7 @@ export class HttpRequestV3 implements INodeType { const paginationData: PaginationOptions = { continue: continueExpression, request: {}, + requestInterval: pagination.requestInterval, }; if (pagination.paginationMode === 'updateAParameterInEachRequest') { diff --git a/packages/workflow/src/Interfaces.ts b/packages/workflow/src/Interfaces.ts index 203a1df591..725c783ed7 100644 --- a/packages/workflow/src/Interfaces.ts +++ b/packages/workflow/src/Interfaces.ts @@ -526,6 +526,7 @@ export interface PaginationOptions { binaryResult?: boolean; continue: boolean | string; request: IRequestOptionsSimplifiedAuth; + requestInterval: number; maxRequests?: number; }