#node.js #express
#node.js #выражать
Вопрос:
У меня есть 2 маршрута:
/api/system/list
— список моих систем/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 основные проблемы:
- порядок маршрутов (в
app.use(..)
) - используйте разные экземпляры
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. Да, я заметил, и это основное различие между нашими версиями. на самом деле он работает сейчас.