Node.js с Express: как перенаправить запрос POST

Я хочу перенаправить с одного запроса URL на другой запрос "POST", например:

var app = require('express')();

app.get('/', function(req, res) {
  res.redirect('/test');
});

app.post('/test', function(req, res) {
  res.send('/test page');
});

app.listen(3000, function() {
  console.log('listenning on port:3000');
});

Ответ 1

Вы можете сделать это:

app.post('/', function(req, res) {
  res.redirect(307, '/test');
});

Который сохранит метод отправки.

Для справки, спецификация 307 http-кода:

307 Временная переадресация (с HTTP/1.1). В этом случае запрос должен быть повторен с другим URI, но будущие запросы все еще могут использовать исходный URI.2. В отличие от 303, метод запроса не должен изменяться при повторной выдаче исходного запроса, Например, запрос POST должен быть повторен с использованием другого запроса POST.

Для получения дополнительной информации см.: http://www.alanflavell.org.uk/www/post-redirect.html

Ответ 2

Имейте в виду архитектуру промежуточного программного обеспечения: каждый обработчик может манипулировать контекстом, а также отвечать или --зывать next().

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

(BTW, приложение-запрос также является функцией, хотя я не уверен, рекомендую ли я вернуться так рано в цепочке)

Вот пример:

const router = new require('express').Router()
const user = require('../model/user') 
//assume user implements:
//  user.byId(id) -> Promise<user>
//  user.byMail(email) -> Promise<user>

const reqUser = userPromise => (req, res, next) =>
   req.user
     ? next()
     : userPromise(req)
       .then(user => { req.user = user })
       .then(next, next)
//assume the sever that uses this router has a 
//standard (err, req, res, next) handler in the end of the chain...

const byId = reqUser( req => user.byId(req.params.id) )
const byMail = reqUser( req => user.byMail(req.params.mail) )

router.post('/by-id/:id/friends',
  byId,
  (req, res) => res.render('user-friends', req.user)
)

router.post('/by-email/:email/friends',
  byMail,
  (req, res, next) => {
     req.url = '/by-id/${req.user.id}/friends'
     next()
  }, 
  router
)

Ответ 3

Единственное различие между 307 и 302 состоит в том, что 307 гарантирует, что метод и тело не будут изменены при выполнении перенаправленного запроса.

https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/307