From b45f3dc9fbfbf190cec4f283b05dac66db5fe8f9 Mon Sep 17 00:00:00 2001 From: Michael Kret <88898367+michael-radency@users.noreply.github.com> Date: Thu, 6 Jun 2024 13:12:52 +0300 Subject: [PATCH] fix(n8n Form Trigger Node): Error if Respond to Webhook and respond node not in workflow (#9641) --- packages/nodes-base/nodes/Form/utils.ts | 40 ++++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/packages/nodes-base/nodes/Form/utils.ts b/packages/nodes-base/nodes/Form/utils.ts index f5adc84e11..3b402303d2 100644 --- a/packages/nodes-base/nodes/Form/utils.ts +++ b/packages/nodes-base/nodes/Form/utils.ts @@ -1,4 +1,9 @@ -import { jsonParse, type IDataObject, type IWebhookFunctions } from 'n8n-workflow'; +import { + NodeOperationError, + jsonParse, + type IDataObject, + type IWebhookFunctions, +} from 'n8n-workflow'; import type { FormField, FormTriggerData, FormTriggerInput } from './interfaces'; export const prepareFormData = ( @@ -77,11 +82,44 @@ export const prepareFormData = ( return formData; }; +const checkResponseModeConfiguration = (context: IWebhookFunctions) => { + const responseMode = context.getNodeParameter('responseMode', 'onReceived') as string; + const connectedNodes = context.getChildNodes(context.getNode().name); + + const isRespondToWebhookConnected = connectedNodes.some( + (node) => node.type === 'n8n-nodes-base.respondToWebhook', + ); + + if (!isRespondToWebhookConnected && responseMode === 'responseNode') { + throw new NodeOperationError( + context.getNode(), + new Error('No Respond to Webhook node found in the workflow'), + { + description: + 'Insert a Respond to Webhook node to your workflow to respond to the form submission or choose another option for the “Respond When” parameter', + }, + ); + } + + if (isRespondToWebhookConnected && responseMode !== 'responseNode') { + throw new NodeOperationError( + context.getNode(), + new Error(`${context.getNode().name} node not correctly configured`), + { + description: + 'Set the “Respond When” parameter to “Using Respond to Webhook Node” or remove the Respond to Webhook node', + }, + ); + } +}; + export async function formWebhook(context: IWebhookFunctions) { const mode = context.getMode() === 'manual' ? 'test' : 'production'; const formFields = context.getNodeParameter('formFields.values', []) as FormField[]; const method = context.getRequestObject().method; + checkResponseModeConfiguration(context); + //Show the form on GET request if (method === 'GET') { const formTitle = context.getNodeParameter('formTitle', '') as string;