Vzor CQRS používajte opatrne a môžete vytvárať čistejšie a škálovateľnejšie aplikácie Nest.

Bežným prístupom k vývoju NestJS je budovanie služieb, s ktorými kontrolóri komunikujú, aby získali prístup k údajom. Tento prístup však nie je jediným platným vzorom dizajnu v NestJS. Existujú aj iné dizajnové vzory, ako napríklad dizajnový vzor CQRS.

CQRS je návrhový vzor, ​​ktorý oddeľuje operácie čítania a zápisu aplikácie. Toto oddelenie môže pomôcť zlepšiť škálovateľnosť, výkon a udržiavateľnosť.

Zistite všetko o CQRS a o tom, ako ho môžete použiť pri vytváraní NestJS API.

Čo je CQRS?

CQRS znamenať segregácia zodpovednosti za príkaz a dopyt. Implementuje použitie príkazy na vytváranie, aktualizáciu a odstraňovanie údajov a otázky na načítanie údajov. To pomáha eliminovať potrebu implementovať volania databázy aplikácie do služieb.

Umožňuje tiež jasné rozlíšenie medzi logikou dotazovania sa na údaje v databáze a vykonávaním iných akcií v aplikácii.

Prístup CQRS je užitočný v doménou riadený dizajn

instagram viewer
, ktorý vám umožňuje oddeliť doménovú logiku a infraštruktúrne operácie vo vašej aplikácii. Môžete ho použiť aj na implementáciu komplexnej obchodnej logiky, ale pre jednoduchšie aplikácie sa to neodporúča.

Používanie CQRS v NestJS API

Návrhový vzor CQRS môžete použiť v rozhraní API, ktoré vytvoríte v NestJS. Ak chcete nasledovať, musíte mať Node.js nainštalovaný na vašom počítači a najnovšiu verziu NestJS.

Pomocou nasledujúcich krokov vytvorte jednoduchú blogovaciu aplikáciu, ktorá implementuje návrhový vzor CQRS.

Vytvorte projekt Nest

Vytvorte nový projekt Nest a vygenerujte a príspevok zdroj pre blogovú aplikáciu. Môžete to urobiť spustením nasledujúcich príkazov v termináli:

hniezdo nové nestjs-cqrs
stĺpiky nest g modulu
nest g stĺpiky regulátora
nest g servisné miesta

Inštalácia závislostí

Po dokončení vyššie uvedených krokov spustite tento príkaz terminálu a nainštalujte balík NestJS CQRS:

npm install --save @nestjs/cqrs

Vytvorte poštovú službu

Pridajte nasledujúci kód do svojho posts.service.ts súbor na definovanie PostService trieda.

// posts.service.ts
importovať { Injekčné } od'@nestjs/common';

exportrozhranie Uverejniť {
názov: reťazec;
obsah: reťazec;
}

@Injekčné()
exporttrieda PostService {
súkromné príspevky len na čítanie: Príspevok[] = [];

create (post: Post): Post {
toto.posts.push (post);
vrátiť príspevok;
}

findById (id: číslo): Uverejniť {
vrátiťtoto.posts.find(príspevok => post.id id);
}
}

The PostService definuje vytvoriť a findById metódy na vytvorenie nového príspevku a získanie existujúceho príspevku z jeho ID.

Definujte príkazy a dotazy

Ďalším krokom je definovanie dotazov a príkazov, ktoré sú jadrom návrhového vzoru CQRS.

V príspevky adresár, vytvorte dva nové súbory: vytvoriťPostCommand.command.ts a getPostQuery.query.ts. Príkazový súbor by mal vyzerať takto:

// createPostCommand.command.ts
exporttrieda CreatePostCommand {
konštruktér(verejnosti názov len na čítanie: reťazec, verejnosti obsah len na čítanie: reťazec) {}
}

A súbor definície dotazu, takto:

// getPostQuery.query.ts
exporttrieda GetPostQuery {
konštruktér(verejnosti ID len na čítanie: číslo) {}
}

Vytvorte obslužné programy príkazov a dotazov

Po úspešnom definovaní príkazov a dotazov pre ne musíte vytvoriť obslužné programy. Obslužný program je funkcia, ktorá spúšťa príkaz alebo dotaz a vracia výsledok.

Vytvor handlers.ts súbor vo vašom príspevok adresár a vložte do neho nasledujúci kód:

// handlers.ts
importovať { CommandHandler, ICommandHandler } od'@nestjs/cqrs';
importovať { CreatePostCommand } od'./createPostCommand.command.ts';
importovať { PostService } od'./post.service';

@CommandHandler(CreatePostCommand)
exporttrieda CreatePostHandler náradia ICommandHandler {
konštruktér(súkromné readonly postService: PostService) {}

async spustiť (príkaz: CreatePostCommand) {
konšt { meno, cena } = príkaz;
konšt príspevok = čakaťtoto.postService.create (názov, obsah);
vrátiť príspevok;
}
}

V rovnakom handlers.ts môžete upraviť príkazy importu tak, aby zahŕňali nižšie uvedené, aby ste umožnili prácu s dopytmi. Potom môžete implementovať obslužný program dotazu, ako je uvedené v kóde nižšie:

// handler.ts
importovať { QueryHandler, IQueryHandler } od'@nestjs/cqrs';
importovať { GetPostQuery } od'./getPostQuery.query';
importovať { PostService } od'./post.service';

// obsluha dotazu
@QueryHandler(GetProductQuery)
exporttrieda GetPostHandler náradia IQueryHandler {
konštruktér(súkromné readonly postService: PostService) {}

async spustiť (dotaz: GetPostQuery) {
konšt { id } = dotaz;
konšt príspevok = čakaťtoto.postService.findOneById (id);
vrátiť príspevok;
}
}

Registrovať manipulátory

Posledným krokom je registrácia obsluhy príkazov a dotazov s modulom NestJS.

// post.module.ts
importovať { Modul } od'@nestjs/common';
importovať { CommandHandlers, QueryHandlers } od'handlers.ts';
importovať { PostService } od'./post.service';

@Modul({
poskytovatelia: [
PostService,
...CommandHandlers,
...QueryHandlers,
],
})
exporttrieda PostModule {}

Tento kód registruje PostService, CommandHandlers, a QueryHandlers v poskytovateľov pole. Použitie operátora spread (...) je zlúčiť polia z dopyt psovodov a príkaz psovodov do poskytovateľov pole.

Vykonávať príkazy a dotazy

Registrované príkazy a obslužné programy dotazov sú použiteľné v ovládačoch. Nasledujúci kód je implementáciou a príspevky radič, ktorý bude prijímať požiadavky HTTP a vracať požadované odpovede.

// posts.controller.ts
importovať { Body, Controller, Post } od'@nestjs/common';
importovať { CommandBus } od'@nestjs/cqrs';
importovať { CreatePostCommand } od'./createPostCommand.command.ts';

// radič, ktorý implementuje príkaz
@Controller('príspevky')
exporttrieda PostController {
konštruktér(súkromné iba na čítanie commandBus: CommandBus) {}

@Príspevok()
async createPost(@Telo() body: { title: reťazec; obsah: reťazec }) {
konšt { nadpis, obsah } = telo;
konšt príkaz = Nový CreatePostCommand (názov, obsah);
konšt príspevok = čakaťtoto.commandBus.execute (príkaz);
vrátiť príspevok;
}
}

Vo vyššie uvedenom kóde je CommandBus vykoná CreatePostCommand a vytvorí nový príspevok.

Tento kód ukazuje, ako implementovať ovládač, ktorý používa dotaz:

// posts.controller.ts
importovať { Controller, Get, Param } od'@nestjs/common';
importovať { QueryBus } od'@nestjs/cqrs';
importovať { GetPostQuery } od'./getPostQuery.query';

@Controller('príspevky')
exporttrieda PostController {
konštruktér(súkromné len na čítanie queryBus: QueryBus) {}

@Získať(':id')
async getPost(@Param('id') id: číslo) {
konšt dotaz = Nový GetPostQuery (id);
konšt príspevok = čakaťtoto.queryBus.execute (dopyt);
vrátiť príspevok;
}
}

The queryBus vykonáva GetPostQuery ktorý dostane príspevok s daným ID a vráti ho.

Po dokončení všetkých vyššie uvedených krokov by ste teraz mali mať minimalistickú fungujúcu aplikáciu na vytváranie a načítanie blogových príspevkov.

Hoci kód tu používa pole na ukladanie vytvorených príspevkov do pamäte, je pravdepodobnejšie, že pri výrobe použijete databázu. Môžete použiť buď a SQL databáza, alebo a NoSQL databáza ako MongoDB, pretože NestJS podporuje obe možnosti.

Vytváranie rozhraní API s návrhovým vzorom CQRS

Začlenenie návrhového vzoru CQRS do vašej aplikácie NestJS môže pomôcť pri škálovateľnosti, výkone a udržiavateľnosti. CQRS umožňuje efektívnejšie a optimalizované operácie oddelením operácií čítania a zápisu, ktoré aplikácia vykonáva.

Balík @nestjs/cqrs poskytuje stavebný blok na implementáciu CQRS v NestJS s príkazmi a obslužnými programami dotazov. Celkovo je CQRS výkonný vzor, ​​ktorý môže pomôcť vytvárať efektívnejšie a škálovateľnejšie aplikácie, a pred jeho použitím by ste mali zvážiť svoje možnosti.