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