В этом небольшом посте я хотел бы поговорить о том, как объединить стиль передачи продолжения (известный из промежуточного программного обеспечения Express) и традиционное аспектно-ориентированное программирование в качестве мощного и гибкого способа создания служб API в NodeJS.

Продолжение прохождения стиля

В функциональном программировании стиль передачи продолжения (CPS) - это стиль программирования, в котором управление передается явно в форме продолжения.

Хотя это определение из Википедии может показаться немного абстрактным, есть одно приложение, которое, вероятно, знает каждый разработчик Node, а именно шаблон связующее ПО промежуточного слоя (теперь чаще называемое промежуточным ПО Экспресс). Идея состоит в том, чтобы иметь уровни обработчиков HTTP-запросов / ответов, каждый из которых обычно делает что-то очень специфичное с запросом или ответом, а затем передает его следующему промежуточному программному обеспечению в цепочке. Вот пример приложения, которое анализирует тело запроса JSON, затем в другом промежуточном программном обеспечении добавляет свойство пользователя и затем отвечает измененным телом:

Хотя этот шаблон наиболее популярен в промежуточном программном обеспечении, он обычно очень полезен для всего, что требует настраиваемого рабочего процесса асинхронной обработки. Дополнительные примеры см. В разделе На примере: стиль передачи продолжения в JavaScript.

Аспектно-ориентированное программирование

Другая часть теории этого поста - это аспектно-ориентированное программирование, которое Википедия определяет как:

Аспект - ориентированное программирование (AOP) дополняет объектно-ориентированное программирование (ООП), предоставляя другой способ мышления Структура программы. Ключевой единицей модульности в ООП является класс, тогда как в АОП единицей модульности является аспект.

Аспекты обычно реализуют так называемые сквозные проблемы в приложении, которые мы не хотим смешивать с самой архитектурой приложения, например, аутентификация пользователя или предварительная / постобработка данных. . Затем аспекты встраиваются в контроллеры / модели / службы приложений во время начальной загрузки приложения. Хотя такое разделение задач в целом является хорошей идеей, аспектно-ориентированное программирование может стать сложным в использовании и трудным для отладки на статически типизированных языках. К счастью, такое поведение намного проще реализовать в JavaScript.

Крючки: аспекты продолжения и передачи

JavaScript известен тем, что объединяет миры объектно-ориентированного и функционального программирования. В оставшейся части этой статьи я хотел бы изучить, как объединить стиль передачи продолжения и АОП в качестве мощного способа создания служб API для Feathers. Если вы не знакомы со службами Feathers, это просто объекты JavaScript, которые можно зарегистрировать как промежуточное ПО Express и предоставить один или несколько из следующих методов:

В то время как Feathers позволяет создавать сервисы любым удобным для вас способом (наиболее распространенным из них, вероятно, является наследование), перья-крючки оказались чрезвычайно полезным плагином Feathers. Хуки работают аналогично промежуточному программному обеспечению Express и могут быть зарегистрированы до или после любого метода службы и управления потоком данных и ошибками с помощью стиля передачи продолжения. Подобно тому, как Express заставляет вас думать о небольшом компонуемом промежуточном программном обеспечении вместо монолитных контроллеров, хуки заставляют вас думать обо всем как о ловушке с простым сервисом в центре, например просто предоставляет базовую функциональность CRUD, такую ​​как перья-mongodb для MongoDB.

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

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

Не забывай бежать

npm install перья перья-mongodb перья-крючки nodemailer body-parser

Большинство хуков могут быть независимыми от базы данных и часто представляют собой всего лишь один лайнер. Еще несколько коротких полезных крючков:

Заключение

В этом коротком посте мы говорили о стиле передачи с продолжением для управления потоками асинхронной обработки и о аспектно-ориентированном программировании как об объектно-ориентированном подходе для решения сквозных задач. Мы рассмотрели плагин «перья-крючки», который объединяет обе концепции и то, как он может помочь в создании повторно используемых хуков для объединения сервисов API Feathers.

Если вы нашли это полезным, поделитесь им с другими и поделитесь своими новыми знаниями о перьях. Если вы ищете дополнительные советы по использованию Feathers, ознакомьтесь с другими статьями в разделе All About Feathers collection.

Вы можете узнать больше о Feathers, просмотрев руководство и документацию по API, подробно изучив код на Github или задав вопросы в нашем чате.