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 कारतोफ्फेलस्क्रिप्ट™
parent d024aee9b7
commit d57da557a0
No known key found for this signature in database
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(
req: WaitingWebhookRequest,
res: express.Response,
@ -56,30 +75,17 @@ export class WaitingForms extends WaitingWebhooks {
}
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 (this.includeForms && req.method === 'GET') {
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>
`);
}
return {
noWebhookResponse: true,
};
await this.reloadForm(req, res);
return { noWebhookResponse: true };
}
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) {
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) {
@ -182,23 +184,25 @@ export class WaitingWebhooks implements IWebhookManager {
if (this.isSendAndWaitRequest(workflow.nodes, suffix)) {
res.render('send-and-wait-no-action-required', { isTestWebhook: false });
return { noWebhookResponse: true };
} else if (!execution.data.resultData.error && execution.status === 'waiting') {
}
if (!execution.data.resultData.error && execution.status === 'waiting') {
const childNodes = workflow.getChildNodes(
execution.data.resultData.lastNodeExecuted as string,
);
const hasChildForms = childNodes.some(
(node) =>
workflow.nodes[node].type === FORM_NODE_TYPE ||
workflow.nodes[node].type === WAIT_NODE_TYPE,
);
if (hasChildForms) {
return { noWebhookResponse: true };
} else {
throw new NotFoundError(errorMessage);
}
} else {
throw new NotFoundError(errorMessage);
}
throw new NotFoundError(errorMessage);
}
const runExecutionData = execution.data;

View file

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