2014-11-29 3 views
14

Я боролся в течение 2 дней на этом, googled и stackoverflowed все, что мог, но я не могу это решить.ExpressJS: res.redirect() работает не так, как ожидалось?

Я создаю приложение простого узла (+ Express + Mongoose) со страницей входа, которая перенаправляется на главную страницу. Вот мой сервер кофе код:

app 
    .get '/', (req, res) -> 
     console.log "Here we are : root" 
     res.sendfile(__dirname + '/index.html') 


    .get '/login', (req, res) -> 
     console.log "Here we are : '/login'" 
     res.sendfile(__dirname + '/login.html') 


    .post '/credentials', (req, res) -> 
     console.log "Here we are : '/credentials'" 

     # (here comes credentials validation stuff with Mongoose) 

     res.redirect '/' 

страница Логин делает запрос POST к/учетным данным, где проверенные размещен данные. Это работает. Я вижу «Вот мы:«/credentials »в консоли узла.

Затем возникает проблема: res.redirect работает неправильно. Я знаю, что он достигнет «/» маршрут, потому что:

  1. Я могу видеть «Вот мы: корень» в консоли узла
  2. страница index.html отправляемой обратно в браузер как ответ, но не отображается в окне. Инспектор Chrome показывает ответ на запрос POST, я могу видеть, что HTML-код отправляется в браузер в инспекторе, но URL остается/логин, и страница входа в систему по-прежнему отображается на экране.

(Изменить) Перенаправление в функции обратного вызова Mongoose, это не синхронно (как должно быть NodeJS). Я просто удалил материал для проверки мандата Mongoose для ясности.

Я попытался добавить res.end(), не работает

Я попытался

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

и

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

Не работает

Что я делаю неправильно? Как я могу фактически покинуть страницу «/ login», перенаправить браузер на «/» и отобразить полученный код HTML?

Спасибо миллион за вашу помощь заранее :)

+1

Вы действительно вызываете страницу учетных данных в своем браузере или делаете запрос AJAX? – mvuajua

+1

Вы когда-нибудь выясняли, что здесь происходит? У меня такая же проблема, проверка подлинности учетных данных не работает для маршрута, указанного как GET, в моем случае профиля пользователя. – OliverJ90

+0

Нет, никогда не понял. Я закончил тем, что создал свое приложение по-другому, с частью входа в модальную, а не с другой страницы ... Очень расстраиваю –

ответ

0

Это почти уверен, что вы делаете вызов асинхронной проверить Мангуст, но вы не структурирован код так, что редирект происходит только после возвращения асинхронной обработки вызовов результат.

В JavaScript, то POST будет выглядеть как-то так:

function validateCredentials(user, callback){ 
    // takes whatever you need to validate the visitor as `user` 
    // uses the `callback` when the results return from Mongoose 
} 

app.post('/credentials', function(req, res){ 
    console.log("Here was are: '/credentials'"; 
    validateCredentials(userdata, function(err, data){ 
     if (err) { 
      // handle error and redirect to credentials, 
      // display an error page, or whatever you want to do here... 
     } 
     // if no error, redirect 
     res.redirect('/'); 
    }; 
}; 

Вы также можете увидеть такие вопросы, как Async call in node.js vs. mongoose для параллельных/проблем, связанных ...

+0

Я забыл упомянуть, но я сделал перенаправление в функции обратного вызова. Я просто удалил материал Mongoose для ясности. Но я собираюсь попробовать вашу архитектуру, спасибо :) –

+0

Если вы не публикуете код, который непосредственно связан с этой проблемой ... Я не уверен, как вы получите ответ. –

+2

Извините. Я точно удалил код, который, я считаю, не связан с моей проблемой. Проверка выполняется, и 'res.redirect ('/')' фактически отправляет на маршрут '/'. Поэтому я считаю, что Mongoose здесь не причина, поэтому для ясности я удалил эту часть. –

0

Добавьте следующее в вашем получить/маршрута:

res.setHeader("Content-Type", "text/html") 

Ваш браузер отображает файл вместо загрузки его

7

Проблема может быть не с бэкэнд, а с интерфейсом. Если вы используете AJAX для отправки запроса POST, он специально разработан, чтобы не менять URL-адрес.

Использование window.location.href после запроса Аякса завершено (в .done()), чтобы обновить URL с заданной траекторией, или использовать JQuery: $('body').replaceWith(data) когда вы получаете HTML обратно из запроса.

+1

Спасибо за ответ, но теперь это старый вопрос, и я больше не использую jQuery. Я переключился на Angular 1, затем Angular 2/4 давным-давно, поэтому у меня больше нет этой проблемы :) Спасибо в любом случае –

+0

Я видел, что это старый вопрос, но это был общий результат для поиска, поэтому я подумал, что я отвечу за всех людей, которые все еще ищут это решение. – Kelrynn

+0

'window.location.assign ('/ newPath')' перенаправляет текущую страницу на http: // localhost: 3000/newPath, которая работала для моего дела. – Progoogler