NodeJS - Неправильный экспресс-маршрут запускается - PullRequest
1 голос
/ 02 апреля 2019

У меня есть следующие маршруты для бэкэнда ...

admin.js

router.get('/contents', ...);  // GET /admin/contents

router.get('/:adminID', ...);  // GET /admin/[adminID]

router.put('/:adminID', ...);  // PUT /admin/[adminID]

router.get('/', ...);  // GET /admin

router.post('/', ...);  // POST /admin

.. но при тестировании следующее:

PUT /admin/contents

запускает маршрут PUT /admin/[adminID]. Но «содержимое» не является идентификатором. Я понимаю, почему это происходит (т.е. это вписывается в шаблон), но я не уверен, что лучшее / общее решение для этого? В идеале я хотел бы, чтобы он признал, что «содержимое» не является идентификатором, а фактически просто пытается использовать недоступную конечную точку.

Я мог бы использовать что-то вроде ...

router.use('/contents', require('./admin-contents'));

но я бы предпочел ограничить каждую конечную точку верхнего уровня одним файлом, а не распределять его по очень многим.

В худшем случае, он будет искать администратора с идентификатором: "content" и вернет "admin not found", но я бы предпочел, чтобы он возвратил 404, потому что это не является доступной конечной точкой для /admin .

Редактировать # 1

Для пояснения, adminID - это комбинация букв и цифр, причем любая из них встречается в любой позиции в строке. Регулярное выражение не будет работать.

Кроме того, единственный маршрут для /admin/contents - это GET. Необходимость реализации пустых маршрутов для всех других методов (PUT, PATCH, DELETE и т. Д.) Также не идеальна.

Ответы [ 2 ]

1 голос
/ 02 апреля 2019

Вы можете указать regex после имени параметра в маршруте, чтобы избежать этого сценария.

router.put('/:adminID(\\d+)', (req, res) => {
   console.log(req.params.adminID); // I'm a number
});

Теперь adminID должно быть числом, иначе оно не будет входить в маршрут.

Хотя это прямо не задокументировано для express маршрутизация , так как экспресс использует path-to-regexp, мы можем увидеть их документацию для этого:

Иэто задокументировано в Настраиваемых параметрах соответствия

const regexpNumbers = pathToRegexp('/icon-:foo(\\d+).png')
// keys = [{ name: 'foo', ... }]

regexpNumbers.exec('/icon-123.png')
//=> ['/icon-123.png', '123']

regexpNumbers.exec('/icon-abc.png')
//=> null

ОБНОВЛЕНИЕ

Ваше предложение проверить хотя бы одно число в известномдлина строки должна работать,

app.put('/:adminID((?:\\w+(?<=\\d+)(?:\\w+)?))', (req, res) => {
   // I have at least 1 number
   // I can have or not alpha-numeric characters
   res.send(req.params.adminID);
});

Регулярное выражение использует Postive lookbehind assertions, которые поддерживаются без каких-либо флагов, начиная с Node.js 9.11.2 .Поэтому, если вы используете старую версию, обновите ее или используйте флаг --harmony, чтобы запустить ее.

0 голосов
/ 02 апреля 2019

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

app.put('/admin/contents',  (req, res) => res.send('contents'))
app.put('/admin/:adminId',  (req, res) => res.send('id'))

При вводе admin/contents, возвращается , для любого другого URL возвращается admin/whatever id .

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