Перенаправить POST в POST с использованием маршрутов Express JS

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

1 ответ

Решение

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

Обычно вы делаете переадресацию, отправляя 301 HTTP-код статуса Moved Permanently или 302 Found. Оба они обычно работают на практике, как если бы это было 303 См. Другое, и делается запрос GET. Смотрите список кодов состояния HTTP в Википедии:

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

Существует 307 временного перенаправления (начиная с 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
}); 

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

Другие вопросы по тегам