Подтвердить что ты не робот

Запрос вперед для альтернативного обработчика запросов вместо перенаправления

Я использую node.js с выражением и уже знаю существование response.redirect().

Однако я ищу дополнительные функции forward(), похожие на java, которые принимают те же параметры, что и перенаправление, но внутренне перенаправляют запрос вместо того, чтобы клиент выполнял перенаправление.

Чтобы уточнить, я не делаю прокси на другом сервере. Я хотел бы переслать ('/other/path') непосредственно в один и тот же пример приложения

Очевидно, не было очевидно, как это сделать из экспресс-документации. Любая помощь?

4b9b3361

Ответ 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)
})