Экспресс-маршрутизация, соответствующая дополнительным токенам URL - PullRequest
0 голосов
/ 07 декабря 2018

Я хотел бы получить URL формы (строго) /forumId/slug/ с Express 'router.get().Дополнительные токены должны привести к 404.

Я придумал этот маршрут: /:forumId([^?\/]{0,}):parameters1?/:slug([^?\/]{0,})?:parameters2?, который в соответствии с express-route-tester ведет себя как ожидалось.

Однако Express, похоже, также перехватывает пути сдополнительные жетоны после пули.Непосредственная передача регулярного выражения Javascript вместо строки имеет тот же эффект.

Вот регулярное выражение, которое я использовал: /^\/(\d+)(?:\?[^\?\/]{0,})?(?:$|\/([^\?\/]{0,})(?:\?[^\?\/]{0,})?\/?$)/

Примеры строк, которые должны соответствовать (эти работы):

/7721
/7721/
/7721?page=2
/7721/ForumTitle/
/7721/AnotherForumTitle?test/
/7721/YetAnotherForumTitle?page=2
/7721?page=3/ForumTitle?page=2
/7721?page=3/ForumTitle?page=2/

Пример строк, которые не должны совпадать:

/7721?page=3/ForumTitle?page=2/threadId

Express использует path-to-regexp для разбора строки и в соответствии с документами (https://www.npmjs.com/package/path-to-regexp#user-content-usage), 'end'по умолчанию для этого параметра установлено значение true, что подтверждает, что совпадение должно прекратиться сразу после слага.

Чего мне не хватает?

Версия Express - 4.16.4.

ОБНОВЛЕНИЕ: удаление части о параметрах запроса (? Page = 2) в регулярном выражении решило проблему. Почему это так? Был ли мой регулярный запрос некорректен (я пытался определить возможные жадные совпадения, но не смог найти) илиэто ожидается от path-to-regexp?

1 Ответ

0 голосов
/ 07 декабря 2018

Как объяснено в документах по экспресс-маршрутизации,

строки запроса не являются частью пути маршрута

(https://expressjs.com/en/guide/routing.html#route-paths).

Попытка деталипоэтому отлавливать параметры запроса в /^\/(\d+)(?:\?[^\?\/]{0,})?(?:$|\/([^\?\/]{0,})(?:\?[^\?\/]{0,})?\/?$)/ не нужно, что приводит к упрощенному /^\/(\d{1,})(?:$|\/([^\/]{0,})\/?$)/:

  • ^\/: начало конечной точки, за которым следует косая черта '/'
  • (\d{1,}): идентификатор форума, состоящий из цифр
  • (?:$|\/([^\/]{0,})\/?$)/: либо заканчивается там, либо захватывает необязательный слаг

Это регулярное выражение соответствует каждому предоставленному примеру, но также захватывается /7721/ForumTitle?page=2/testчто должно привести к 404. После дальнейшего исследования я заметил, что '/ test' был захвачен как часть параметров запроса в req.query ({"page": "2/test"}).

Это странно, так как косая черта '/'должен быть зарезервированным символом для разделения ( Символы, разрешенные в параметре GET ). Дополнительная информация будет полезна.

РЕДАКТИРОВАТЬ: процитировать Дугласа Уилсона (из там ), Express.js uses Node.js core to parse the paths according to the url spec. Node.js's URL модульсоответствует стандарту WHATWG URL .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...