Обработка псевдонима маршрута с помощью параметров запроса - PullRequest
0 голосов
/ 10 января 2020

В Express есть ли лучший способ сделать следующее?

Проблема в том, что перенаправление вызывает отдельный запрос. Так что мне интересно, есть ли лучший способ?

// List disabled users
router.get(
    '/disabled', (req,res,next) => {
         res.redirect(`${req.baseUrl}?isEnabled=false`);
    }
);

 // List multiple users
router.get('/',
   getMultipleUsers // This accepts query params for sorting, filtering, pagination, etc
)

По сути, /disabled является "псевдонимом" для ?isEnabled=false.

Есть ли стандартный способ обработки этого в Express?

1 Ответ

1 голос
/ 10 января 2020

Вы можете просто манипулировать запросом и использовать здесь процесс промежуточного программного обеспечения Express, например,

router.get('/disabled', (req, res, next) => {
  req.query.isEnabled = false;
  return next('/');
});

Так что мой первоначальный ответ выше, к сожалению, был недоразумением. В документации объясняется, что маршруты могут быть пропущены (или завершены досрочно) через next('route') - это была моя интерпретация, согласно которой route в данном случае представлял собой любой URL-адрес маршрута, на который вы хотели ориентироваться, например, next('/some-url'), но это не так передача 'route' в next на самом деле представляет собой особый вариант использования, который обрабатывается внутри, все, что передается в next, приводит к ошибке, как объяснено в документах

Если вы передадите что-нибудь в функцию next () (кроме строки 'route'), Express будет рассматривать текущий запрос как ошибку и пропустит все оставшиеся функции маршрутизации и промежуточного программного обеспечения, не связанные с обработкой ошибок

Изначально я понимал, что только если объект Error был передан next, это могло бы произойти, что явно не так

При таком понимании и рассмотрении порядок важен для других маршрутов, которые у вас могут быть, например /:id, идея позволить запросу "провалиться" по маршруту /disabled в / больше не будет работать, как если бы Вы поймали быть /:id заранее. В таком случае, я думаю, что вам лучше всего здесь вручную установить параметр запроса в соответствии с примером, но также задать URL-адрес в соответствии с желаемым маршрутом, например

router.get('/disabled', (req, res, next) => {
  req.query.isEnabled = false;
  req.url = '/';
  return next();
});

router.get('/:id', ...);

router.get('/', getMultipleUsers);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...