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
, 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.