Три года назад я начал разрабатывать 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 с помощью собственной функции ограничения.
Это должна быть просто функция, возвращающая классическое промежуточное ПО для экспресс-обработки.
Заключение
Я уже давно пользуюсь этим методом. Мне нравится иметь такую самоуверенную структуру, которой я придерживаюсь при разработке. В конце концов, это помогает мне поддерживать хорошую кодовую базу и не использовать ярлыки, такие как написание слишком большого количества логики в одном файле или определение маршрута в неподходящем файле.
Спасибо за прочтение. Расскажите в комментариях, что вы думаете о такой организации контроллеров.
Если вы нашли эту статью полезной, отпустите 💯