Узел expressJwt, если не указан идентификатор маршрута

Мы используем библиотеку expressJwt, и я хочу иметь возможность исключить GET по следующему маршруту api/items/:id но не включать какие-либо маршруты, которые выглядят как api/items/:id/special-action,

До сих пор я был в состоянии исключить только все маршруты, которые имеют :id,

Ниже показано, как мы достигли, за исключением GET маршруты, которые имеют :id,

this.app.use(expressJwt({ secret: secrets.JWT }).unless({
  path: [
    ...
    { url: /\/api\/items\/(.)/, methods: ['GET'] },
    ...
  ]
});

я пробовал { url: /\/api\/items\/(.)\//, methods: ['GET'] } но тогда не совпадает ни с какими маршрутами и поэтому нет маршрутов с :id быть исключенным.

Что-то не так в том, как я использую регулярное выражение, но мне трудно это увидеть. Нужно ли менять (.) не совпадать всем? Я предполагаю, что это может соответствовать косой черты

1 ответ

Решение

Вы можете использовать

/^\/api\/items\/([^\/]*)$/

[^\/]* класс отрицанных символов соответствует 0 или более символам, отличным от / и ^ / $ якоря гарантируют, что шаблон будет использован против всей строки.

Смотрите демо-версию регулярного выражения.

подробности

  • ^ - начало привязки строки
  • \/api\/items\/ - соответствует буквальному /api/items/ подстрока
  • ([^\/]*) - Захват группы 1: любые 0+ символов, кроме /,
  • $ конец строки привязки. Обратите внимание, что если вы хотите убедиться, что [^\/]* не имеет / после, добавить $ конец строки привязки в конце.
Другие вопросы по тегам