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")
Ваш браузер будет отображать файл вместо его загрузки