Express Router - разные маршруты с одинаковыми суффиксами - PullRequest
0 голосов
/ 17 апреля 2019

У меня есть 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 списков книг (/api/system/:systemId/books/list), он фактически вызывает API систем списков (/api/system/list)

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

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

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

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

1 Ответ

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

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

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

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

Кроме того, я думаю, что вы используете неправильный маршрутизатор в соответствии с документацией 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);

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