Tengo un código nodejs donde el usuario inicialmente está en localhost:3000/index una vez que se inicia el código, la página /index tiene un formulario, una vez que el usuario hace clic en el botón Enviar, es redirigido a otra página localhost:3000/process hay un POST solicitud (en el archivo script.js ) que envía esos datos al servidor, luego la solicitud POST en el lado del server necesita execute a function , solo una vez que se ejecuta la función (que está dentro de la solicitud POST) entonces me gustaría que el usuario ser redirigido a otra página localhost:3000/done
res.render('done') y res.redirect('/done') al final de la solicitud de publicación no funcionan.
He intentado muchas cosas, pero aún no puedo ser redirigido una vez que se ejecuta la función dentro de la solicitud de post .
la estructura de mi proyecto es así:
public folder structure: js_folder: script.js routes folder: index.js process.js done.js views folder: index.ejs process.ejs done.ejs app.js file ****** ******* ******* *** ****así es como se ve el archivo process.js:
const express = require('express'); const router = express.Router(); /*once the user clicks on submit button (in the localhost:3000/index page) he is redirected */ router.get('/process', async (req, res) => { // this process.ejs is showing 'please wait until function is executed' res.render('process') }); router.post('/process', async (req, res) => { // getting data sent by the form var data = req.body; const functionOne = async function firstFunction() { //do something } const secondFunction = async () => { const update = await functionOne() console.log('something is done'); // now I would like to redirect the user to the 'localhost:3000/done' } secondFunction(); });/****** *************************** **********/
the script.js file: function launchTerraform() { var data = { instances: document.getElementById('firstName').value, region: document.getElementById('lastName').value } var xhr = new window.XMLHttpRequest() xhr.onreadystatechange = function () { if (this.readyState === 4 && this.status === 200 && this.responseText) { } } xhr.open('POST', '/provision', true) xhr.setRequestHeader('Content-Type', 'application/json;charset=UTF-8') xhr.send(JSON.stringify(data)) window.location.href = '/process' }Su función de servidor podría simplemente enviar una respuesta vacía (con estado 200) después de que se haya completado la función asíncrona.
router.post('/process', async (req, res) => { var data = req.body; const functionOne = async function firstFunction() { //do something asynchronous with data } await functionOne(); res.end(); }); Luego, la secuencia de comandos de su cliente podría decirle al usuario que espere antes de realizar un XHR a /process y realizar la redirección a /done después de que haya llegado la respuesta de estado 200.
xhr.onreadystatechange = function() { if (this.readyState === 4 && this.status === 200) { window.location.href = '/done'; } }; document.getElementById("some_placeholder").textContent = "Please wait ..."; xhr.open('POST', '/process', true); xhr.setRequestHeader('Content-Type', 'application/json;charset=UTF-8'); xhr.send(JSON.stringify(data));Solo puedes enviar una respuesta.
Una solución para esto es usar express-flash para mostrar el mensaje "por favor espere", y luego, una vez que haya terminado, puede usar su respuesta 1 para redirigir al usuario a la página "/hecho" haciendo res.redirect("/done") . Pero eso requiere que uses pasaporte y analizador de cookies.