Как лучше всего организовать похожие маршруты и контроллеры в ExpressJS?

Итак, у меня есть файл 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);

Есть ли наилучшая практика для такого сценария? Что вы, ребята, делаете в своих собственных проектах?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
214
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Лучше хранить все запросы, связанные с одним и тем же ресурсом, например 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) {
}
...

Спасибо за ответ @Anatoly, это было очень полезно! У меня только что был быстрый дополнительный вопрос, который в некоторой степени связан с организацией. Что делать, если ваш маршрут содержит 2 разных ресурса? Как узнать, в каком контроллере должна работать логика? Например, предположим, что у вас есть API для получения списка автомобилей, принадлежащих пользователю: /users/:userId/cars. Было бы разумнее поместить логику в контроллер users или в контроллер cars? Я бы поспорил с контроллером cars, но мне любопытно, что бы вы сказали?

ccmetz92 26.12.2020 16:25

Это зависит от задач и того, как ресурсы связаны друг с другом. Если вы хотите получить cars по другим критериям вместе с user/:id, то cars должен быть родительским ресурсом. Наоборот, если у пользователя есть разные подресурсы, такие как автомобили, дома, квартиры и т. д., то user должен быть родительский ресурс.

Anatoly 26.12.2020 16:30

Другие вопросы по теме