Използвайте шаблона 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

Създайте нов проект Nest и генерирайте a пост ресурс за блог приложение. Можете да направите това, като изпълните следните команди в терминал:

гнездо нов nestjs-cqrs
nest g модулни постове
nest g контролни постове
nest g сервизни постове

Инсталиране на зависимости

След като изпълните стъпките по-горе, изпълнете тази терминална команда, за да инсталирате пакета NestJS CQRS:

npm install --save @nestjs/cqrs

Създайте пощенска услуга

Добавете следния код към вашия posts.service.ts файл за определяне на PostService клас.

// posts.service.ts
импортиране { Инжекционен } от„@nestjs/common“;

износинтерфейс публикация {
заглавие: низ;
съдържание: низ;
}

@Инжекционен()
износклас PostService {
частен публикации само за четене: публикация [] = [];

създаване (публикуване: Публикуване): Публикуване {
това.posts.push (пост);
връщане пост;
}

findById (id: номер): Публикувай {
връщанетова.posts.find(пост => post.id id);
}
}

The PostService определя създавам и findById методи за създаване на нова публикация и получаване на съществуваща публикация от нейния идентификатор.

Дефиниране на команди и заявки

Следващата стъпка е да се дефинират заявките и командите, които са в основата на шаблона за проектиране на CQRS.

В публикации директория, създайте два нови файла: създайтеPostCommand.command.ts и getPostQuery.query.ts. Командният файл трябва да изглежда така:

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

И файлът с дефиниция на заявката, като този:

// getPostQuery.query.ts
износклас GetPostQuery {
конструктор(публичен ИД само за четене: номер) {}
}

Създайте манипулатори на команди и заявки

След като успешно дефинирате вашите команди и заявки, трябва да създадете манипулатори за тях. Манипулаторът е функция, която изпълнява команда или заявка и връща резултата.

Създавам манипулатори.ц файл във вашия пост директория и поставете следния код в нея:

// handlers.ts
импортиране {CommandHandler, ICommandHandler} от'@nestjs/cqrs';
импортиране { CreatePostCommand } от'./createPostCommand.command.ts';
импортиране { PostService } от'./post.service';

@CommandHandler(CreatePostCommand)
износклас Създаване на PostHandler инструменти ICommandHandler {
конструктор(частен само за четене postService: PostService) {}

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

В същото манипулатори.ц файл, можете да промените изразите за импортиране, за да включите тези по-долу, за да позволите работа със заявки. След това можете да приложите манипулатора на заявки, както се вижда в кода по-долу:

// handler.ts
импортиране { QueryHandler, IQueryHandler } от'@nestjs/cqrs';
импортиране { GetPostQuery } от'./getPostQuery.query';
импортиране { PostService } от'./post.service';

// манипулатор на заявка
@QueryHandler(GetProductQuery)
износклас GetPostHandler инструменти IQueryHandler {
конструктор(частен само за четене postService: PostService) {}

асинхронен изпълни (заявка: GetPostQuery) {
конст { id } = заявка;
конст пост = изчакайтетова.postService.findOneById (id);
връщане пост;
}
}

Регистрирайте манипулатори

Последната стъпка е да регистрирате манипулаторите на команди и заявки с модула NestJS.

// post.module.ts
импортиране { Модул } от„@nestjs/common“;
импортиране {CommandHandlers, QueryHandlers} от'handlers.ts';
импортиране { PostService } от'./post.service';

@Модул({
доставчици: [
PostService,
...CommandHandlers,
...QueryHandlers,
],
})
износклас PostModule {}

Този код регистрира PostService, CommandHandlers, и QueryHandlers в доставчици масив. Използването на оператор за разпространение (...) е да обедини масивите от заявка манипулатори и команда манипулатори в доставчици масив.

Изпълнявайте команди и заявки

Регистрираните команди и манипулатори на заявки могат да се използват в контролери. Следният код е имплементацията на a публикации контролер, който ще приема HTTP заявки и ще връща необходимите отговори.

// posts.controller.ts
импортиране {Тяло, контролер, пост} от„@nestjs/common“;
импортиране {CommandBus} от'@nestjs/cqrs';
импортиране { CreatePostCommand } от'./createPostCommand.command.ts';

// контролер, който изпълнява команда
@Контролер("постове")
износклас PostController {
конструктор(частен само за четене commandBus: CommandBus) {}

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

В кода по-горе, CommandBus изпълнява CreatePostCommand и създава нова публикация.

Този код показва как да внедрите контролер, който използва заявка:

// posts.controller.ts
импортиране { Controller, Get, Param } от„@nestjs/common“;
импортиране {QueryBus} от'@nestjs/cqrs';
импортиране { GetPostQuery } от'./getPostQuery.query';

@Контролер("постове")
износклас PostController {
конструктор(частен само за четене queryBus: QueryBus) {}

@Вземете(':документ за самоличност')
асинхронен getPost(@Парам('документ за самоличност') документ за самоличност: номер) {
конст заявка = нов GetPostQuery (id);
конст пост = изчакайтетова.queryBus.execute (заявка);
връщане пост;
}
}

The queryBus изпълнява GetPostQuery който получава публикацията с даден ID и я връща.

След като изпълните всички стъпки по-горе, вече трябва да имате минималистично работещо приложение за създаване и извличане на публикации в блогове.

Въпреки че кодът тук използва масив за съхраняване на създадените публикации в паметта, по-вероятно е да използвате база данни в производството. Можете да използвате или a SQL база данни, или a NoSQL база данни като MongoDB, тъй като NestJS поддържа и двете опции.

Изграждане на API с шаблона за проектиране CQRS

Включването на шаблона за проектиране CQRS във вашето приложение NestJS може да помогне за мащабируемост, производителност и поддръжка. CQRS позволява по-ефективни и оптимизирани операции чрез разделяне на операциите за четене и запис, извършвани от приложението.

Пакетът @nestjs/cqrs предоставя градивен елемент за внедряване на CQRS в NestJS с команди и манипулатори на заявки. Като цяло CQRS е мощен модел, който може да помогне за създаването на по-ефективни и мащабируеми приложения и трябва да претеглите възможностите си, преди да го използвате.