mirror of
https://github.com/n8n-io/n8n.git
synced 2024-12-24 04:04:06 -08:00
⚡ Fix issue with thrown errors for nodes with multiple webhooks
This commit is contained in:
parent
717708d3cc
commit
b171cfbb10
|
@ -258,17 +258,20 @@ export class ActiveWorkflowRunner {
|
|||
await Db.collections.Webhook?.insert(webhook);
|
||||
|
||||
const webhookExists = await workflow.runWebhookMethod('checkExists', webhookData, NodeExecuteFunctions, mode, false);
|
||||
if (webhookExists === false) {
|
||||
if (webhookExists !== true) {
|
||||
// If webhook does not exist yet create it
|
||||
await workflow.runWebhookMethod('create', webhookData, NodeExecuteFunctions, mode, false);
|
||||
}
|
||||
|
||||
} catch (error) {
|
||||
try {
|
||||
await this.removeWorkflowWebhooks(workflow.id as string);
|
||||
} catch (error) {
|
||||
console.error(`Could not remove webhooks of workflow "${workflow.id}" because of error: "${error.message}"`);
|
||||
}
|
||||
|
||||
let errorMessage = '';
|
||||
|
||||
await Db.collections.Webhook?.delete({ workflowId: workflow.id });
|
||||
|
||||
// if it's a workflow from the the insert
|
||||
// TODO check if there is standard error code for deplicate key violation that works
|
||||
// with all databases
|
||||
|
|
|
@ -156,9 +156,12 @@ export class TestWebhooks {
|
|||
}, 120000);
|
||||
|
||||
let key: string;
|
||||
const activatedKey: string[] = [];
|
||||
for (const webhookData of webhooks) {
|
||||
key = this.activeWebhooks!.getWebhookKey(webhookData.httpMethod, webhookData.path);
|
||||
|
||||
activatedKey.push(key);
|
||||
|
||||
this.testWebhookData[key] = {
|
||||
sessionId,
|
||||
timeout,
|
||||
|
@ -166,7 +169,13 @@ export class TestWebhooks {
|
|||
workflowData,
|
||||
};
|
||||
|
||||
try {
|
||||
await this.activeWebhooks!.add(workflow, webhookData, mode);
|
||||
} catch (error) {
|
||||
activatedKey.forEach(deleteKey => delete this.testWebhookData[deleteKey] );
|
||||
await this.activeWebhooks!.removeWorkflow(workflow);
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
|
@ -189,8 +198,6 @@ export class TestWebhooks {
|
|||
continue;
|
||||
}
|
||||
|
||||
foundWebhook = true;
|
||||
|
||||
clearTimeout(this.testWebhookData[webhookKey].timeout);
|
||||
|
||||
// Inform editor-ui that webhook got received
|
||||
|
@ -207,9 +214,15 @@ export class TestWebhooks {
|
|||
|
||||
// Remove the webhook
|
||||
delete this.testWebhookData[webhookKey];
|
||||
|
||||
if (foundWebhook === false) {
|
||||
// As it removes all webhooks of the workflow execute only once
|
||||
this.activeWebhooks!.removeWorkflow(workflow);
|
||||
}
|
||||
|
||||
foundWebhook = true;
|
||||
}
|
||||
|
||||
return foundWebhook;
|
||||
}
|
||||
|
||||
|
|
|
@ -52,7 +52,7 @@ export class ActiveWebhooks {
|
|||
|
||||
try {
|
||||
const webhookExists = await workflow.runWebhookMethod('checkExists', webhookData, NodeExecuteFunctions, mode, this.testWebhooks);
|
||||
if (webhookExists === false) {
|
||||
if (webhookExists !== true) {
|
||||
// If webhook does not exist yet create it
|
||||
await workflow.runWebhookMethod('create', webhookData, NodeExecuteFunctions, mode, this.testWebhooks);
|
||||
|
||||
|
@ -60,7 +60,6 @@ export class ActiveWebhooks {
|
|||
} catch (error) {
|
||||
// If there was a problem unregister the webhook again
|
||||
delete this.webhookUrls[webhookKey];
|
||||
delete this.workflowWebhooks[webhookData.workflowId];
|
||||
|
||||
throw error;
|
||||
}
|
||||
|
@ -159,7 +158,7 @@ export class ActiveWebhooks {
|
|||
|
||||
|
||||
/**
|
||||
* Removes all the webhooks of the given workflow
|
||||
* Removes all the webhooks of the given workflows
|
||||
*/
|
||||
async removeAll(workflows: Workflow[]): Promise<void> {
|
||||
const removePromises = [];
|
||||
|
|
|
@ -68,12 +68,6 @@ export class TrelloTrigger implements INodeType {
|
|||
webhookMethods = {
|
||||
default: {
|
||||
async checkExists(this: IHookFunctions): Promise<boolean> {
|
||||
if (this.getWebhookName() === 'setup') {
|
||||
// Is setup-webhook which only gets used once when
|
||||
// the webhook gets created so nothing to do.
|
||||
return true;
|
||||
}
|
||||
|
||||
const credentials = this.getCredentials('trelloApi');
|
||||
|
||||
if (credentials === undefined) {
|
||||
|
@ -101,12 +95,6 @@ export class TrelloTrigger implements INodeType {
|
|||
return false;
|
||||
},
|
||||
async create(this: IHookFunctions): Promise<boolean> {
|
||||
if (this.getWebhookName() === 'setup') {
|
||||
// Is setup-webhook which only gets used once when
|
||||
// the webhook gets created so nothing to do.
|
||||
return true;
|
||||
}
|
||||
|
||||
const webhookUrl = this.getNodeWebhookUrl('default');
|
||||
|
||||
const credentials = this.getCredentials('trelloApi');
|
||||
|
@ -137,12 +125,6 @@ export class TrelloTrigger implements INodeType {
|
|||
return true;
|
||||
},
|
||||
async delete(this: IHookFunctions): Promise<boolean> {
|
||||
if (this.getWebhookName() === 'setup') {
|
||||
// Is setup-webhook which only gets used once when
|
||||
// the webhook gets created so nothing to do.
|
||||
return true;
|
||||
}
|
||||
|
||||
const webhookData = this.getWorkflowStaticData('node');
|
||||
|
||||
if (webhookData.webhookId !== undefined) {
|
||||
|
|
Loading…
Reference in a new issue