Используйте шаблон CQRS с осторожностью, и вы сможете создавать более чистые и масштабируемые приложения Nest.

Обычный подход к разработке NestJS заключается в создании сервисов, с которыми контроллеры взаимодействуют для доступа к данным. Но этот подход — не единственный допустимый шаблон проектирования в NestJS. Существуют и другие шаблоны проектирования, такие как шаблон проектирования CQRS.

CQRS — это шаблон проектирования, который разделяет операции чтения и записи в приложении. Такое разделение может помочь улучшить масштабируемость, производительность и удобство обслуживания.

Узнайте все о CQRS и о том, как его можно применить при создании NestJS API.

Что такое CQRS?

CQRS означает разделение ответственности команд и запросов. Он реализует использование команды создавать, обновлять и удалять данные и запросы для получения данных. Это помогает устранить необходимость реализации вызовов базы данных приложения в службы.

Это также позволяет четко различать логику запроса данных к базе данных и выполнения других действий в приложении.

instagram viewer

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

Использование CQRS в NestJS API

Вы можете использовать шаблон проектирования CQRS в API, созданном в NestJS. Чтобы следовать, вам нужно иметь Node.js установлен на вашем компьютере и последняя версия NestJS.

Используйте следующие шаги, чтобы создать простое приложение для ведения блога, реализующее шаблон проектирования CQRS.

Создать проект гнезда

Создайте новый проект Nest и сгенерируйте почта ресурс для приложения блога. Вы можете сделать это, выполнив следующие команды в терминале:

вложить новые NestJS-CQRS
гнездо сообщений g-модуля
посты контроллера гнезда g
сервисные посты гнездо г

Установить зависимости

После того, как вы выполнили описанные выше шаги, запустите эту команду терминала, чтобы установить пакет NestJS CQRS:

npm установить --сохранить @nestjs/cqrs

Создать почтовый сервис

Добавьте следующий код в свой сообщения.service.ts файл для определения Постсервис сорт.

// сообщения.service.ts
Импортировать { Инъекционный } от'@nestjs/общий';

экспортинтерфейс Почта {
заголовок: нить;
содержание: нить;
}

@Инъекционный()
экспортсорт Почтовая служба {
частный сообщения только для чтения: Post[] = [];

создать (опубликовать: опубликовать): опубликовать {
этот.posts.push (пост);
возвращаться почта;
}

findById (идентификатор: число): Почта {
возвращатьсяэтот.сообщения.найти(почта => post.id идентификатор);
}
}

Постсервис определяет создавать и найти по идентификатору методы для создания нового сообщения и получения существующего сообщения по его идентификатору.

Определение команд и запросов

Следующим шагом является определение запросов и команд, которые являются основными для шаблона проектирования CQRS.

в сообщения каталог, создайте два новых файла: создатьPostCommand.command.ts и getPostQuery.query.ts. Командный файл должен выглядеть так:

// createPostCommand.command.ts
экспортсорт CreatePostCommand {
конструктор(публичный заголовок только для чтения: нить, публичный содержимое только для чтения: нить) {}
}

И файл определения запроса, например:

// получитьPostQuery.query.ts
экспортсорт GetPostQuery {
конструктор(публичный только для чтения идентификатор: число) {}
}

Создание обработчиков команд и запросов

После того, как вы успешно определили свои команды и запросы, вам необходимо создать для них обработчики. Обработчик — это функция, которая запускает команду или запрос и возвращает результат.

Создать обработчики.ts файл в вашем почта каталог и вставьте в него следующий код:

// обработчики.ts
Импортировать { CommandHandler, ICommandHandler} от'@nestjs/cqrs';
Импортировать { CreatePostCommand } от'./createPostCommand.command.ts';
Импортировать {Постсервис} от'./post.service';

@CommandHandler(Создатьпосткоманду)
экспортсорт CreatePostHandler реализует ICommandHandler {
конструктор(частный только для чтения postService: PostService) {}

асинхронный выполнить (команда: CreatePostCommand) {
константа {имя, цена} = команда;
константа сообщение = Ждитеэтот.postService.create (заголовок, контент);
возвращаться почта;
}
}

В то же самое обработчики.ts файл, вы можете изменить операторы импорта, включив в них приведенные ниже, чтобы разрешить работу с запросами. Затем вы можете реализовать обработчик запросов, как показано в приведенном ниже коде:

// обработчик.ts
Импортировать { QueryHandler, IQueryHandler} от'@nestjs/cqrs';
Импортировать {Постзапрос} от'./getPostQuery.query';
Импортировать {Постсервис} от'./post.service';

// обработчик запросов
@QueryHandler(ПолучитьПродуктКери)
экспортсорт GetPostHandler реализует IQueryHandler {
конструктор(частный только для чтения postService: PostService) {}

асинхронный выполнить (запрос: GetPostQuery) {
константа {идентификатор} = запрос;
константа сообщение = Ждитеэтот.postService.findOneById (идентификатор);
возвращаться почта;
}
}

Регистрация обработчиков

Последний шаг — зарегистрировать обработчики команд и запросов в модуле NestJS.

// post.module.ts
Импортировать {Модуль} от'@nestjs/общий';
Импортировать { обработчики команд, обработчики запросов } от'handlers.ts';
Импортировать {Постсервис} от'./post.service';

@Модуль({
провайдеры: [
почтовая служба,
... обработчики команд,
... обработчики запросов,
],
})
экспортсорт Постмодуль {}

Этот код регистрирует Постсервис, Обработчики команд, и обработчики запросов в провайдеры множество. Использование оператора спреда (...) заключается в объединении массивов запрос обработчики и команда обработчики в провайдеры множество.

Выполнение команд и запросов

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

// сообщения.controller.ts
Импортировать { Тело, Контроллер, Сообщение } от'@nestjs/общий';
Импортировать { Командная шина } от'@nestjs/cqrs';
Импортировать { CreatePostCommand } от'./createPostCommand.command.ts';

// контроллер, реализующий команду
@контроллер('сообщения')
экспортсорт Постконтроллер {
конструктор(частный командная шина только для чтения: CommandBus) {}

@Почта()
асинхронный создать сообщение (@Тело() тело: { название: нить; содержание: нить }) {
константа {название, содержание} = тело;
константа команда = новый CreatePostCommand (название, содержание);
константа сообщение = Ждитеэтот.commandBus.execute (команда);
возвращаться почта;
}
}

В приведенном выше коде Командная шина выполняет CreatePostCommand и создает новый пост.

Этот код показывает, как реализовать контроллер, использующий запрос:

// сообщения.controller.ts
Импортировать {Контроллер, Получить, Параметр} от'@nestjs/общий';
Импортировать { шина запросов } от'@nestjs/cqrs';
Импортировать {Постзапрос} от'./getPostQuery.query';

@контроллер('сообщения')
экспортсорт Постконтроллер {
конструктор(частный шина запросов только для чтения: шина запросов) {}

@Получать(':идентификатор')
асинхронный получить сообщение (@Парам('идентификатор') идентификатор: число) {
константа запрос = новый GetPostQuery (идентификатор);
константа сообщение = Ждитеэтот.queryBus.execute (запрос);
возвращаться почта;
}
}

шина запросов выполняет GetPostQuery который получает сообщение с заданным идентификатором и возвращает его.

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

Хотя код здесь использует массив для хранения созданных сообщений в памяти, вы, скорее всего, будете использовать базу данных в рабочей среде. Вы можете либо использовать База данных SQLили База данных NoSQL, такая как MongoDB, так как NestJS поддерживает оба варианта.

Создание API с помощью шаблона проектирования CQRS

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

Пакет @nestjs/cqrs предоставляет строительный блок для реализации CQRS в NestJS с помощью команд и обработчиков запросов. В целом, CQRS — это мощный шаблон, который может помочь в создании более эффективных и масштабируемых приложений, и вы должны взвесить свои варианты, прежде чем использовать его.