ExpressJS: res.redirect() работает не так, как ожидалось?

Я боролся в течение 2 дней на этом, googled и stackoverflowed все, что мог, но я не могу это решить.

Я создаю простое приложение node (+ 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, где проверенные данные проверяются. Это работает. Я вижу "Вот мы:" /credentials "в консоли node.

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

  • Я вижу "Здесь мы: root" в консоли node
  • Страница index.html отправляется обратно в браузер как ответ, но не отображается в окне. Инспектор Chrome показывает ответ запроса POST. Я могу видеть, что HTML-код отправляется в браузер в инспекторе, но URL остается/логин и страница входа в систему по-прежнему отображается на экране.

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

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

Я пробовал

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

и

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

Не работает

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

Спасибо за помощь за помощь:)

Ответы

Ответ 1

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

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

Ответ 2

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

В 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('/');
    };
};

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

Ответ 3

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

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

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