fix(n8n Form Node): Form Trigger does not wait in multi-form mode (#11404)

This commit is contained in:
Michael Kret 2024-10-25 13:49:36 +03:00 committed by GitHub
parent 8b0a48f530
commit 151f4dd7b8
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 38 additions and 25 deletions

View file

@ -38,6 +38,25 @@ export class WaitingForms extends WaitingWebhooks {
}); });
} }
private async reloadForm(req: WaitingWebhookRequest, res: express.Response) {
try {
await sleep(1000);
const url = `${req.protocol}://${req.get('host')}${req.originalUrl}`;
const page = await axios({ url });
if (page) {
res.send(`
<script>
setTimeout(function() {
window.location.reload();
}, 1);
</script>
`);
}
} catch (error) {}
}
async executeWebhook( async executeWebhook(
req: WaitingWebhookRequest, req: WaitingWebhookRequest,
res: express.Response, res: express.Response,
@ -56,30 +75,17 @@ export class WaitingForms extends WaitingWebhooks {
} }
if (execution.data.resultData.error) { if (execution.data.resultData.error) {
throw new ConflictError(`The execution "${executionId}" has finished with error.`); const message = `The execution "${executionId}" has finished with error.`;
this.logger.debug(message, { error: execution.data.resultData.error });
throw new ConflictError(message);
} }
if (execution.status === 'running') { if (execution.status === 'running') {
if (this.includeForms && req.method === 'GET') { if (this.includeForms && req.method === 'GET') {
await sleep(1000); await this.reloadForm(req, res);
return { noWebhookResponse: true };
const url = `${req.protocol}://${req.get('host')}${req.originalUrl}`;
const page = await axios({ url });
if (page) {
res.send(`
<script>
setTimeout(function() {
window.location.reload();
}, 1);
</script>
`);
} }
return {
noWebhookResponse: true,
};
}
throw new ConflictError(`The execution "${executionId}" is running already.`); throw new ConflictError(`The execution "${executionId}" is running already.`);
} }

View file

@ -102,7 +102,9 @@ export class WaitingWebhooks implements IWebhookManager {
} }
if (execution.data?.resultData?.error) { if (execution.data?.resultData?.error) {
throw new ConflictError(`The execution "${executionId} has finished already.`); const message = `The execution "${executionId}" has finished with error.`;
this.logger.debug(message, { error: execution.data.resultData.error });
throw new ConflictError(message);
} }
if (execution.finished) { if (execution.finished) {
@ -182,23 +184,25 @@ export class WaitingWebhooks implements IWebhookManager {
if (this.isSendAndWaitRequest(workflow.nodes, suffix)) { if (this.isSendAndWaitRequest(workflow.nodes, suffix)) {
res.render('send-and-wait-no-action-required', { isTestWebhook: false }); res.render('send-and-wait-no-action-required', { isTestWebhook: false });
return { noWebhookResponse: true }; return { noWebhookResponse: true };
} else if (!execution.data.resultData.error && execution.status === 'waiting') { }
if (!execution.data.resultData.error && execution.status === 'waiting') {
const childNodes = workflow.getChildNodes( const childNodes = workflow.getChildNodes(
execution.data.resultData.lastNodeExecuted as string, execution.data.resultData.lastNodeExecuted as string,
); );
const hasChildForms = childNodes.some( const hasChildForms = childNodes.some(
(node) => (node) =>
workflow.nodes[node].type === FORM_NODE_TYPE || workflow.nodes[node].type === FORM_NODE_TYPE ||
workflow.nodes[node].type === WAIT_NODE_TYPE, workflow.nodes[node].type === WAIT_NODE_TYPE,
); );
if (hasChildForms) { if (hasChildForms) {
return { noWebhookResponse: true }; return { noWebhookResponse: true };
} else {
throw new NotFoundError(errorMessage);
} }
} else {
throw new NotFoundError(errorMessage);
} }
throw new NotFoundError(errorMessage);
} }
const runExecutionData = execution.data; const runExecutionData = execution.data;

View file

@ -752,6 +752,8 @@
console.error('Error:', error); console.error('Error:', error);
}); });
const isWaitingForm = window.location.href.includes('form-waiting');
if(isWaitingForm) {
const interval = setInterval(function() { const interval = setInterval(function() {
const isSubmited = document.querySelector('#submitted-form').style.display; const isSubmited = document.querySelector('#submitted-form').style.display;
if(isSubmited === 'block') { if(isSubmited === 'block') {
@ -761,6 +763,7 @@
window.location.reload(); window.location.reload();
}, 2000); }, 2000);
} }
}
}); });
</script> </script>
</body> </body>