Три года назад я начал разрабатывать API Express.js для компании. Мне было интересно, какая архитектура контроллеров может быть лучшей, чтобы оставаться организованной по мере роста кодовой базы.

Под влиянием Sails или Rails и моих исследований я пришел к созданию своей собственной системы. Я не хотел перегружать свой проект, используя полный фреймворк, такой как Sails, а при необходимости выбирал более легкие зависимости.

Поэтому я создал систему организации для контроллеров приложения, которую соединил с самодельным загрузчиком . С тех пор я улучшил их обоих благодаря опыту, который я получил, внедряя ее в других проектах.

Сегодня я достаточно уверен в этом методе, чтобы поделиться им, так как результаты убедительны.

Насколько мне известно, им пользуются несколько крупных компаний. Это упрощает привлечение новых разработчиков, так как упрощает чтение кодовой базы.

✅ Вот как настроить чистую архитектуру контроллеров.

Структура

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

Настройте свое файловое дерево

  • Групповые маршруты в контроллерах
  • Создайте папки для каждого контроллера
  • Создайте файл маршрутизации в каждом контроллере, который описывает путь каждого маршрута, вызываемый метод, связанное с ним промежуточное ПО и уровень ограничения.
  • Создайте файл для каждого действия контроллера, который содержит метод для выполнения и промежуточное ПО.
  • Создайте файл спецификации для тестирования

Посмотрим, как это выглядит.

Не бойтесь создавать много файлов. Это не замедляет разработку и делает вашу кодовую базу аккуратной и воздушной. ✨

Загрузите свои маршруты

Чтобы все работало в соответствии со структурой, определенной выше, нам нужно использовать простой загрузчик, который я создал: Lumie. Он пройдет через ваши контроллеры, прочитает файлы определений и загрузит ваши маршруты.

Это небольшой пакет, вы можете проверить исходный код на GitHub.

Файлы маршрутизации

Они разработаны таким образом, чтобы их было легко читать. Цель состоит в том, чтобы иметь возможность определять методы обновления в процессе разработки, быстро просматривая файлы .routing. В следующем примере будут созданы три маршрута:

  • [PUT] / пользователь
  • [GET] / пользователь
  • [GET] / user / reset-password

Вы задаетесь вопросом, почему маршруты имеют префикс «пользователь», хотя это не описано в определении маршрутизации. Lumie использует имя папки, в которой находится файл маршрутизации, для префикса маршрутов.

Здесь мы находимся в controllers/user/user.routing.js. Если бы папка user находилась в подпапке admin, например, маршруты имели бы префикс admin/user.

Обратите внимание, что вы можете передать необязательное поле path в определение маршрутизации, чтобы оно использовалось вместо поля по умолчанию.

Действия и промежуточное ПО

Как вы можете видеть выше, каждая конфигурация маршрутов имеет метод действия, который является не чем иным, как логикой, выполняемой, когда мы вызываем ваш маршрут API. Я рекомендую хранить в одном файле: метод одного действия и его необязательное связанное промежуточное ПО.

Ограничения

Для каждой конфигурации маршрутов вы выбираете связанный уровень ограничений. Значение уровня будет передано в функцию ограничения, которую вы создадите, чтобы Lumie работал. См. Как инициализировать Lumie с помощью собственной функции ограничения.

Это должна быть просто функция, возвращающая классическое промежуточное ПО для экспресс-обработки.

Заключение

Я уже давно пользуюсь этим методом. Мне нравится иметь такую ​​самоуверенную структуру, которой я придерживаюсь при разработке. В конце концов, это помогает мне поддерживать хорошую кодовую базу и не использовать ярлыки, такие как написание слишком большого количества логики в одном файле или определение маршрута в неподходящем файле.

Спасибо за прочтение. Расскажите в комментариях, что вы думаете о такой организации контроллеров.

Если вы нашли эту статью полезной, отпустите 💯