From db91305af3e79225c2c6850f732468217336c458 Mon Sep 17 00:00:00 2001 From: Lucia Seggiaro Date: Fri, 8 May 2026 16:40:45 +0200 Subject: [PATCH 1/2] fix: preserve original error types when continueOnFail is off --- nodes/ScraperApi/ScraperApi.node.ts | 64 ++++++++++++++--------------- 1 file changed, 30 insertions(+), 34 deletions(-) diff --git a/nodes/ScraperApi/ScraperApi.node.ts b/nodes/ScraperApi/ScraperApi.node.ts index fce335f..008a9c3 100644 --- a/nodes/ScraperApi/ScraperApi.node.ts +++ b/nodes/ScraperApi/ScraperApi.node.ts @@ -3,9 +3,8 @@ import type { INodeExecutionData, INodeType, INodeTypeDescription, - JsonObject, } from 'n8n-workflow'; -import { NodeApiError, NodeConnectionTypes, NodeOperationError } from 'n8n-workflow'; +import { NodeConnectionTypes, NodeOperationError } from 'n8n-workflow'; import { ApiResource } from './resources/api/ApiResource'; import { ApiOperations, ApiFields } from './resources/api/ApiDescription'; import { CrawlerResource } from './resources/crawler/CrawlerResource'; @@ -71,43 +70,40 @@ export class ScraperApi implements INodeType { sde: SdeResource, } as const; - for (let i = 0; i < items.length; i++) { - try { - const ResourceClass = resourceMap[resource as keyof typeof resourceMap]; - if (!ResourceClass) { - throw new NodeOperationError(this.getNode(), `Unknown resource type: ${resource}`); - } - - const resourceInstance = new ResourceClass(this); - const response = await resourceInstance.executeRequest(i); + const ResourceClass = resourceMap[resource as keyof typeof resourceMap]; + if (!ResourceClass) { + throw new NodeOperationError(this.getNode(), `Unknown resource type: ${resource}`); + } - returnData.push({ - json: { - resource, - response: { - body: response.body, - headers: response.headers, - statusCode: response.statusCode, - statusMessage: response.statusMessage, - }, + const executeOne = async (i: number): Promise => { + const resourceInstance = new ResourceClass(this); + const response = await resourceInstance.executeRequest(i); + return { + json: { + resource, + response: { + body: response.body, + headers: response.headers, + statusCode: response.statusCode, + statusMessage: response.statusMessage, }, - pairedItem: { - item: i, - }, - }); - } catch (error) { - if (this.continueOnFail()) { + }, + pairedItem: { item: i }, + }; + }; + + for (let i = 0; i < items.length; i++) { + if (this.continueOnFail()) { + try { + returnData.push(await executeOne(i)); + } catch (error) { returnData.push({ - json: { - error: error.message, - }, - pairedItem: { - item: i, - }, + json: { error: error.message }, + pairedItem: { item: i }, }); - continue; } - throw new NodeApiError(this.getNode(), error as JsonObject, { itemIndex: i }); + } else { + returnData.push(await executeOne(i)); } } From 5e1c614ba5c9830760edab3b0acc831311fb84e3 Mon Sep 17 00:00:00 2001 From: Lucia Seggiaro Date: Fri, 8 May 2026 16:41:48 +0200 Subject: [PATCH 2/2] docs: readme updated --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6f9f939..0bbad5c 100644 --- a/README.md +++ b/README.md @@ -461,7 +461,7 @@ Get real estate agent information from Redfin. - **1.1.0**: Crawler resource: initiate crawler jobs, get job status, and cancel jobs. - **1.2.0**: Structured Data Endpoints (SDEs) resource for Amazon, Google, Walmart, eBay, and Redfin. - **1.2.1**: Refactor SDE optional parameters into per-operation collections to satisfy the n8n community node validator. -- **1.2.2**: Publish via GitHub Actions with npm provenance attestation; bump `@n8n/node-cli` to `^0.29.1`. +- **1.2.2**: Publish via GitHub Actions with npm provenance attestation; bump `@n8n/node-cli` to `^0.29.1`; preserve original error types (e.g. `NodeOperationError`) when `continueOnFail` is off. ## More ScraperAPI Integrations