Экспресс-маршрутизатор — разные маршруты с одинаковыми суффиксами

#node.js #express

#node.js #выражать

Вопрос:

У меня есть 2 маршрута:

  1. /api/system/list — список моих систем
  2. /api/system/:systemId/books/list — список книг текущей системы

И разные файлы для каждого API:

systemAPI.js:

 const list = router.get('/list', Validate(Validation.list), listHandler)
return {
    routes: [list]
}
 

bookAPI.js:

 const list = router.get('/list', Validate(Validation.list), listHandler)
return {
    routes: [list]
}
 

Наконец, используйте вышеуказанные маршруты:

 express.use('/api/system', systemAPI.routes)
express.use('/api/system/:systemId/book', bookAPI.routes)
 

Проблема в том, что когда я ввожу API-интерфейс list-books ( /api/system/:systemId/books/list ), он фактически вызывает API-интерфейс list-systems ( /api/system/list )

Обновление: решено!

У меня было 2 основные проблемы:

  1. порядок маршрутов (в app.use(..) )
  2. используйте разные экземпляры Express.Router() для каждого API

Обратитесь к ответу ниже для получения дополнительной информации.

Ответ №1:

Попробуйте изменить порядок маршрутов, и это, вероятно, решит вашу проблему:

 express.use('/api/system/:systemId/book', bookAPI.routes);
express.use('/api/system', systemAPI.routes);
 

Причина в том, что express оценивает маршруты «жадно» и даже разрешает частичные совпадения. Поэтому важно сначала сохранить более конкретные маршруты перед более общими.

Кроме того, я думаю, что вы неправильно используете экспресс-маршрутизатор в соответствии с документацией systemAPI:

 const express = require('express');
const router = express.Router();
router.get('/list', Validate(Validation.list), listHandler)

module.exports = router;
 

Маршрут bookAPI:

 const express = require('express');
const router = express.Router();
router.get('/list', Validate(Validation.list), listHandler)

module.exports = router;
 

Наконец, импортируйте маршрутизаторы и используйте их:

 const express = require('express');
const bookRouter = require('./bookAPI'); //set the file paths based on your file structure
const systemRouter = require('./systemAPI');
const app = express();

app.use('/api/system/:systemId/book', bookRouter);
app.use('/api/system', systemRouter);

 

Комментарии:

1. Тот же результат, но если я меняю порядок конструкций API, я получаю другие результаты. Я думаю, что это скоро будет решено

2. Я изменил ответ. Попробуйте сейчас.

3. Должен ли я использовать новый экземпляр express. Маршрутизатор () для каждого API? к настоящему времени я использую то же самое, это может быть проблемой?

4. Да, вы должны использовать разные для каждого маршрута или, скорее, группы маршрутов. Если вы заметили, я создаю экземпляр нового маршрутизатора в каждом файле.

5. Да, я заметил, и это основное различие между нашими версиями. на самом деле он работает сейчас.