Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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 :)

like image 688
Jeremy Thille Avatar asked Nov 29 '14 12:11

Jeremy Thille


People also ask

What does res redirect() Function do?

The res. redirect() function redirects to the URL derived from the specified path, with specified status, a integer (positive) which corresponds to an HTTP status code. The default status is “302 Found”.

How to redirect URL in express js?

redirect() function lets you redirect the user to a different URL by sending an HTTP response with status 302. The HTTP client (browser, Axios, etc.) will then "follow" the redirect and send an HTTP request to the new URL as shown below. const app = require('express')(); // The `res.

How do I redirect a response in node JS?

redirect() function, we can now discuss how to redirect back to original URL in NodeJS. Back redirect: We can use this method to redirects the request back to the referrer. If no referrer is present, the request is redirected to “/” route by default.

Which method enables to redirect a route in Express?

In express, we can use the res. redirect() method to redirect a user to the different route. The res. redirect() method takes the path as an argument and redirects the user to that specified path.


2 Answers

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.

like image 186
Kelrynn Avatar answered Oct 03 '22 15:10

Kelrynn


If you are using an asynchronous request to backend and then redirecting in backend, it will redirect in backend (i.e. it will create a new get request to that URL), but won't change the URL in front end.

To make it work you need to:

  1. use window.location.href = "/url"
  2. change your async request (in front end) to simple anchor tag (<a></a>)
like image 34
user13074009 Avatar answered Oct 03 '22 15:10

user13074009