2016-11-09 4 views
0

У меня есть целевая страница ('/'). На этой странице есть форма входа для имени пользователя и пароля с кнопкой отправки. У меня есть app.get, который загружает страницу и app.post для получения параметров формы. Однако я намерен иметь app.post ('/ login', function (req, res) {// logic}); Для загрузки нет/логина или страницы для загрузки, это просто будет содержать логику для входа в систему (проверка имени пользователя и т. Д.). Есть ли простой способ получить сообщение от '/' для перенаправления в сообщение для/логин без его попытки загрузить страницу/login, которой не существует?Перенаправить POST на POST с использованием Express JS маршрутов

+0

Было бы хорошо, если бы кто-нибудь сообщил мне, было ли нарушение политики или если мой вопрос был неприемлемым по какой-либо причине, а не просто просто его голосование. –

+0

Был ли мой ответ ниже для вас? Если это так, вы можете рассмотреть [принятие ответа] (http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work/5235#5235), чтобы другие люди искали эту проблему увидит, что ваш вопрос имеет принятый ответ. – rsp

ответ

2

Я не уверен, правильно ли я понял ваш вопрос. Насколько я понимаю, вы хотите, чтобы ваш запрос POST / перенаправлялся на запросы POST до /login, что может быть сложно.

Обычно вы делаете переадресацию, отправляя либо 301 Перемещенный на постоянной основе, либо 302 Найдено код состояния HTTP. Оба они обычно работают на практике, как если бы это было 303 См. «Прочее», и был сделан запрос GET. См. List of HTTP status codes в Википедии:

Это пример отраслевой практики, противоречащей стандарту. Спецификация HTTP/1.0 (RFC 1945) требовала, чтобы клиент выполнял временную переадресацию (исходная фраза описана «Перемещена Временно»), но популярные браузеры реализованы 302 с функциональностью 303 См. Другое. Поэтому HTTP/1.1 добавил статус кодов 303 и 307, чтобы различать два поведения. Однако, некоторые веб-приложения и среды используют код 302 состояния , как если бы это было 303.

Существует 307 Temporary Redirect (с HTTP/1.1), созданный для решения этого вопроса, который не имеет права на изменение метод HTTP - поэтому перенаправление с POST должно быть POST - см. Википедия:

В этом случае запрос должен быть повторен с другим URI; Однако в будущих запросах все равно должен использоваться оригинальный URI. В отличие от того, как было реализовано 302, метод запроса не может быть изменен при повторной выдаче первоначального запроса. Например, для примера запрос POST должен быть повторен с использованием другого запроса POST .

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

Мое предложение было бы либо изменить:

app.post('/login', function (req, res) { 
    // logic 
}); 

к этому:

function loginHandler(req, res) { 
    // logic 
} 
app.post('/login', loginHandler); 
app.post('/', loginHandler); 

или что-то вроде этого, используя регулярные выражения:

app.post(/^\/(?:login)?$/, function (req, res) { 
    // logic 
}); 

Таким образом, вместо того, чтобы перенаправление того же обработчика будет использоваться для обоих этих маршрутов. Это было бы быстрее и надежнее, потому что таким образом вы не полагаетесь на перенаправление, работающую так, как вы хотите - перенаправления вообще нет.

Смежные вопросы