From abe033d7a1592baa9ee655f9b4c313f0c030d188 Mon Sep 17 00:00:00 2001 From: Omar Ajoue Date: Wed, 29 Jun 2022 14:12:28 +0200 Subject: [PATCH] Handle errors from example node and clarified options about credentials and properties --- credentials/HttpBinApi.credentials.ts | 40 ++++++++++----------------- nodes/ExampleNode/ExampleNode.node.ts | 24 ++++++++++++++-- package.json | 4 +-- 3 files changed, 38 insertions(+), 30 deletions(-) diff --git a/credentials/HttpBinApi.credentials.ts b/credentials/HttpBinApi.credentials.ts index 8ccd44f..62f170b 100644 --- a/credentials/HttpBinApi.credentials.ts +++ b/credentials/HttpBinApi.credentials.ts @@ -1,4 +1,5 @@ import { + IAuthenticateGeneric, ICredentialDataDecryptedObject, ICredentialTestRequest, ICredentialType, @@ -17,12 +18,6 @@ export class HttpBinApi implements ICredentialType { type: 'string', default: '', }, - // { - // displayName: "API Key", - // name: "apiKey", - // type: "string", - // default: "", - // }, { displayName: 'Domain', name: 'domain', @@ -31,26 +26,21 @@ export class HttpBinApi implements ICredentialType { }, ]; - // authenticate = { - // type: "headerAuth", - // properties: { - // name: "api-key", - // value: "={{$credentials.apiKey}}", - // }, - // } as IAuthenticateHeaderAuth; - - authenticate = async ( - credentials: ICredentialDataDecryptedObject, - requestOptions: IHttpRequestOptions, - ): Promise => { - const headers = requestOptions.headers || {}; - const authentication = { Authorization: `Bearer ${credentials.token}` }; - Object.assign(requestOptions, { - headers: { ...authentication, ...headers }, - }); - return requestOptions; - }; + // This allows the credential to be used by other parts of n8n + // stating how this credential is injected as part of the request + // An example is the Http Request node that can make generic calls + // reusing this credential + authenticate = { + type: 'generic', + properties: { + header: { + name: 'api-key', + value: '={{$credentials.apiKey}}', + }, + }, + } as IAuthenticateGeneric; + // The block below tells how this credential can be tested test: ICredentialTestRequest = { request: { baseURL: '={{$credentials?.domain}}', diff --git a/nodes/ExampleNode/ExampleNode.node.ts b/nodes/ExampleNode/ExampleNode.node.ts index 3bbadf4..73f568e 100644 --- a/nodes/ExampleNode/ExampleNode.node.ts +++ b/nodes/ExampleNode/ExampleNode.node.ts @@ -28,6 +28,10 @@ export class ExampleNode implements INodeType { ], }; + // The function below is responsible for actually doing whatever this node + // is supposed to do. In this case, we're just appending the `myString` property + // with whatever the user has entered. + // You can make async calls and use `await`. async execute(this: IExecuteFunctions): Promise { const items = this.getInputData(); @@ -38,10 +42,24 @@ export class ExampleNode implements INodeType { // value the parameter "myString" resolves to. // (This could be a different value for each item in case it contains an expression) for (let itemIndex = 0; itemIndex < items.length; itemIndex++) { - myString = this.getNodeParameter('myString', itemIndex, '') as string; - item = items[itemIndex]; + try { + myString = this.getNodeParameter('myString', itemIndex, '') as string; + item = items[itemIndex]; + + item.json['myString'] = myString; + } catch (error) { + + // This node should never fail but we want to showcase how + // to handle errors. + if (this.continueOnFail()) { + items.push({json: this.getInputData(itemIndex)[0].json, error}); + } else { + // Adding `itemIndex` allows other workflows to handle this error + if (error.context) error.context.itemIndex = itemIndex; + throw error; + } + } - item.json['myString'] = myString; } return this.prepareOutputData(items); diff --git a/package.json b/package.json index 72720bc..fadce8b 100644 --- a/package.json +++ b/package.json @@ -42,8 +42,8 @@ "@typescript-eslint/parser": "^5.29.0", "eslint-plugin-n8n-nodes-base": "~1.1.1", "gulp": "^4.0.2", - "n8n-core": "~0.122.1", - "n8n-workflow": "~0.104.0", + "n8n-core": "^0.124.0", + "n8n-workflow": "^0.106.0", "prettier": "^2.7.1", "tslint": "^6.1.2", "typescript": "~4.6.0"