node.jshttp-redirectexpress

ExpressJS : res.redirect() not working as expected?


I've been struggling for 2 days on this one, googled and stackoverflowed all I could, but I can't work it out.

I'm building a simple node app (+Express + Mongoose) with a login page that redirects to the home page. Here's my server JS code :

app
    .get('/', (req, res) => {
        console.log("Here we are : root");
        return res.sendfile(__dirname + '/index.html');
    })
    .get('/login', (req, res) => {
        console.log("Here we are : '/login'");
        return res.sendfile(__dirname + '/login.html');
    })
    .post('/credentials', (req, res) => {
        console.log("Here we are : '/credentials'");
        // Some Mongoose / DB validations
        return res.redirect('/');
    });

The login page makes a POST request to /credentials, where posted data is verified. This works. I can see "Here we are : '/credentials'" in the Node console.

Then comes the issue : the res.redirect doesn't work properly. I know that it does reach the '/' route, because :

  1. I can see "Here we are : root" in the Node console
  2. The index.html page is being sent back to the browser as a reponse, but not displayed in the window. Chrome inspector shows the POST request response, I CAN see the HTML code being sent to the browser in the inspector, but the URL remains /login and the login page is still being displayed on screen.

(Edit) The redirection is in Mongoose's callback function, it's not synchronous (as NodeJS should be). I have just removed Mongoose validation stuff for clarity.

I have tried adding res.end(), doesn't work

I have tried

req.method = 'get'; 
res.redirect('/');

and

res.writeHead(302, {location: '/'});
res.end();

Doesn't work

What am I doing wrong? How can I actually leave the '/login' page, redirect the browser to '/' and display the HTML code that it received?

Thanks a million for your help in advance :)


Solution

  • The problem might not lie with the backend, but with the frontend. If you are using AJAX to send the POST request, it is specifically designed to not change your url.

    Use window.location.href after AJAX's request has completed (in the .done()) to update the URL with the desired path, or use JQuery: $('body').replaceWith(data) when you receive the HTML back from the request.