Итак, у меня есть файл routes/index.js
, в котором я определяю все свои маршруты и импортирую любые контроллеры, которые мне нужны. Например, маршрут, который я определил, может выглядеть так:
router.get('/cars', carsController);
Мой главный вопрос: как лучше всего обрабатывать похожие маршруты для разных методов http? Должен ли я создать совершенно новый файл контроллера для каждого метода http? Я чувствую, что со временем это может привести к большому количеству файлов контроллера. Должен ли я повторно использовать один контроллер для всех методов http, а затем использовать логику внутри контроллера, чтобы определить, что делать? ( if (req.method === 'GET')
и т. д.).
Пример одного контроллера (один файл контроллера большего размера):
router.get('/cars', carsController);
router.get('/cars/:id', carsController);
router.put('/cars/:id', carsController);
router.post('/cars', carsController);
router.delete('/cars/:id', carsController);
Пример с несколькими контроллерами (несколько файлов контроллеров меньшего размера):
router.get('/cars', getCarsController);
router.get('/cars/:id', getCarsController);
router.put('/cars/:id', updateCarsController);
router.post('/cars', createCarsController);
router.delete('/cars/:id', deleteCarsController);
Есть ли наилучшая практика для такого сценария? Что вы, ребята, делаете в своих собственных проектах?
Лучше хранить все запросы, связанные с одним и тем же ресурсом, например cars
, вместе в одном файле контроллера, например cars.js
, и указать, что он должен отвечать за весь путь /cars
:
router.use('/cars', carsController);
в cars.js
вы можете обрабатывать все желаемые методы http:
router.route('/')
.get(function(req, res) {
})
.post(function(req, res) {
})
.delete(function(req, res) {
})
.put(function(req, res) {
});
ИЛИ
router.get('/', getCars);
router.get('/:id', getCar);
router.put('/:id', updateCar);
router.post('/', createCar);
router.delete('/:id', deleteCar);
...
function getCars(req, res) {
}
...
Это зависит от задач и того, как ресурсы связаны друг с другом. Если вы хотите получить cars
по другим критериям вместе с user/:id
, то cars
должен быть родительским ресурсом. Наоборот, если у пользователя есть разные подресурсы, такие как автомобили, дома, квартиры и т. д., то user
должен быть родительский ресурс.
Спасибо за ответ @Anatoly, это было очень полезно! У меня только что был быстрый дополнительный вопрос, который в некоторой степени связан с организацией. Что делать, если ваш маршрут содержит 2 разных ресурса? Как узнать, в каком контроллере должна работать логика? Например, предположим, что у вас есть API для получения списка автомобилей, принадлежащих пользователю:
/users/:userId/cars
. Было бы разумнее поместить логику в контроллерusers
или в контроллерcars
? Я бы поспорил с контроллеромcars
, но мне любопытно, что бы вы сказали?