Запрос вперед для альтернативного обработчика запросов вместо перенаправления
Я использую node.js с выражением и уже знаю существование response.redirect().
Однако я ищу дополнительные функции forward(), похожие на java, которые принимают те же параметры, что и перенаправление, но внутренне перенаправляют запрос вместо того, чтобы клиент выполнял перенаправление.
Чтобы уточнить, я не делаю прокси на другом сервере. Я хотел бы переслать ('/other/path') непосредственно в один и тот же пример приложения
Очевидно, не было очевидно, как это сделать из экспресс-документации. Любая помощь?
Ответы
Ответ 1
Вам просто нужно вызвать соответствующую функцию обработчика маршрута.
Вариант 1: маршрутизировать несколько путей к одной и той же функции обработчика
function getDogs(req, res, next) {
//...
}}
app.get('/dogs', getDogs);
app.get('/canines', getDogs);
Вариант 2. Вызов отдельной функции обработчика вручную/условно
app.get('/canines', function (req, res, next) {
if (something) {
//process one way
} else {
//do a manual "forward"
getDogs(req, res, next);
}
});
Вариант 3: вызов next('route')
Если вы тщательно заказываете свои шаблоны маршрутизатора, вы можете вызвать next('route')
, который может достичь того, чего вы хотите. В основном это говорит о том, что "продолжайте движение по списку шаблонов маршрутизатора" вместо вызова next()
, в котором говорится, чтобы выразить "переместить список промежуточного программного обеспечения (мимо маршрутизатора)".
Ответ 2
Вы можете реализовать функциональность forward (aka переписать), изменив свойство url
запроса next('route')
.
Обратите внимание, что обработчик, выполняющий пересылку, должен быть настроен перед другими маршрутами, которые вы выполняете вперед.
Это пример пересылки всех документов *.html
в маршруты без расширения .html
(суффикс).
function forwards(req, res, next) {
if (/(?:.+?)\.html$/.test(req.url)) {
req.url = req.url.replace(/\.html$/, '');
}
next('route');
}
Вы вызываете next('route')
в качестве последней операции. next('route')
передает управление последующим маршрутам.
Как уже упоминалось выше, вам нужно настроить обработчик forwards как один из первых обработчиков.
app.get('*', forwards);
// ...
app.get('/someroute', handler);
В приведенном выше примере будет возвращен тот же контент для /someroute
, а также /someroute.html
. Вы также можете предоставить объект с набором передовых правил ({ '/path1': '/newpath1', '/path2': '/newpath2' }
) и использовать их в прямом механизме.
Обратите внимание, что регулярное выражение, используемое в функции forwards
, упрощается для целей представления механизма. Вам нужно будет расширить его (или выполнить проверку на req.path
), если вы хотите использовать параметры запроса и т.д.
Я надеюсь, что это поможет.
Ответ 3
app.get('/menzi', function (req, res, next) {
console.log('menzi2');
req.url = '/menzi/html/menzi.html';
// res.redirect('/menzi/html/menzi.html');
next();
});
Это мой код: когда пользователь вводит "/menzi", сервер будет предоставлять страницу /menzi/html/menzi.html пользователю, но URL-адрес в браузере не изменится;
Ответ 4
Использование функции next
не работает, если следующий обработчик не добавлен в правильном порядке. Вместо использования next
я использую маршрутизатор для регистрации обработчиков и вызова
router.get("/a/path", function(req, res){
req.url = "/another/path";
router.handle(req, res);
}
Ответ 5
Вы можете использовать модуль run-middleware
для этого. Просто запустите обработчик, который вы хотите, используя URL, метод и данные.
https://www.npmjs.com/package/run-middleware
Например:
app.runMiddleware('/get-user/20',function(code,body,headers){
res.status(code).send(body)
})