Pažljivo koristite CQRS uzorak i možete izraditi čistije, skalabilnije Nest aplikacije.
Uobičajeni pristup razvoju NestJS-a je izgradnja usluga s kojima kontroleri komuniciraju radi pristupa podacima. Ali ovaj pristup nije jedini važeći obrazac dizajna u NestJS-u. Postoje i drugi obrasci dizajna, kao što je CQRS obrazac dizajna.
CQRS je obrazac dizajna koji odvaja operacije čitanja i pisanja aplikacije. Ovo odvajanje može pomoći u poboljšanju skalabilnosti, performansi i lakoće održavanja.
Saznajte sve o CQRS-u i kako ga možete primijeniti prilikom izrade NestJS API-ja.
Što je CQRS?
CQRS stoji za naredba-upit odgovornost segregacija. Provodi korištenje naredbe za stvaranje, ažuriranje i brisanje podataka i upite dohvatiti podatke. To pomaže u uklanjanju potrebe za implementacijom poziva baze podataka aplikacije u usluge.
Također omogućuje jasnu razliku između logike traženja podataka u bazi podataka i izvođenja drugih radnji u aplikaciji.
CQRS pristup je koristan u dizajn vođen domenom, koji vam omogućuje odvajanje logike domene i infrastrukturnih operacija u vašoj aplikaciji. Također ga možete koristiti za implementaciju složene poslovne logike, ali to se ne preporučuje za jednostavnije aplikacije.
Korištenje CQRS-a u NestJS API-ju
Možete koristiti CQRS uzorak dizajna u API-ju koji gradite u NestJS-u. Da biste slijedili, morate imati Node.js instaliran na vašem računalu i noviju verziju NestJS-a.
Upotrijebite sljedeće korake za izradu jednostavne aplikacije za bloganje koja implementira CQRS obrazac dizajna.
Napravite Nest projekt
Napravite novi Nest projekt i generirajte a objaviti izvor za blog aplikaciju. To možete učiniti pokretanjem sljedećih naredbi u terminalu:
ugnijezditi novi nestjs-cqrs
nest g stupovi modula
gnijezdo g kontrolnih postova
gnijezdo g službenih postova
Instalirajte ovisnosti
Nakon što dovršite gore navedene korake, pokrenite ovu naredbu terminala da instalirate NestJS CQRS paket:
npm install --save @nestjs/cqrs
Stvorite poštansku uslugu
Dodajte sljedeći kôd svom postovi.usluga.ts datoteku za definiranje PostService razreda.
// posts.service.ts
uvoz { Injekcioni } iz'@nestjs/common';izvozsučelje objavi {
titula: niz;
sadržaj: niz;
}@Injekcioni()
izvozrazreda PostService {
privatna postovi samo za čitanje: Post[] = [];kreiraj (post: Objavi): Objavi {
ovaj.posts.push (post);
povratak post;
}
findById (id: broj): Post {
povratakovaj.posts.find(objaviti => post.id id);
}
}
The PostService definira stvoriti i findById metode za stvaranje nove objave i dobivanje postojeće objave iz njenog ID-a.
Definirajte naredbe i upite
Sljedeći korak je definiranje upita i naredbi koje su srž CQRS uzorka dizajna.
u postovi imenik, stvorite dvije nove datoteke: stvoritiPostCommand.command.ts i getPostQuery.query.ts. Naredbena datoteka bi trebala izgledati ovako:
// createPostCommand.command.ts
izvozrazreda CreatePostCommand {
konstruktor(javnost naslov samo za čitanje: niz, javnost sadržaj samo za čitanje: niz) {}
}
I datoteku definicije upita, ovako:
// getPostQuery.query.ts
izvozrazreda GetPostQuery {
konstruktor(javnost ID samo za čitanje: broj) {}
}
Stvorite rukovatelje naredbama i upitima
Nakon što ste uspješno definirali svoje naredbe i upite, trebate izraditi rukovatelje za njih. Rukovatelj je funkcija koja pokreće naredbu ili upit i vraća rezultat.
Stvoriti rukovatelji.ts datoteku u vašem objaviti imenik i u njega zalijepite sljedeći kod:
// rukovatelji.ts
uvoz {CommandHandler, ICommandHandler} iz'@nestjs/cqrs';
uvoz { CreatePostCommand } iz'./createPostCommand.command.ts';
uvoz { PostService } iz'./post.service';@CommandHandler(CreatePostCommand)
izvozrazreda CreatePostHandler oruđa ICommandHandler{
konstruktor(privatna samo za čitanje postService: PostService) {}
asinkroni izvrši (naredba: CreatePostCommand) {
konst { ime, cijena } = naredba;
konst post = čekatiovaj.postService.create (naslov, sadržaj);
povratak post;
}
}
U istom rukovatelji.ts datoteku, možete izmijeniti naredbe za uvoz kako biste uključili one ispod, kako biste omogućili rad s upitima. Zatim možete implementirati rukovatelj upitima kao što se vidi u donjem kodu:
// rukovatelj.ts
uvoz {QueryHandler, IQueryHandler} iz'@nestjs/cqrs';
uvoz { GetPostQuery } iz'./getPostQuery.query';
uvoz { PostService } iz'./post.service';// obrađivač upita
@QueryHandler(GetProductQuery)
izvozrazreda GetPostHandler oruđa IQueryHandler{
konstruktor(privatna samo za čitanje postService: PostService) {}
asinkroni izvrši (upit: GetPostQuery) {
konst { id } = upit;
konst post = čekatiovaj.postService.findOneById (id);
povratak post;
}
}
Rukovatelji registra
Zadnji korak je registracija rukovatelja naredbama i upitima s NestJS modulom.
// post.module.ts
uvoz { Modul } iz'@nestjs/common';
uvoz {CommandHandlers, QueryHandlers} iz'handlers.ts';
uvoz { PostService } iz'./post.service';
@Modul({
pružatelji usluga: [
PostService,
...Rukovatelji naredbama,
...QueryHandlers,
],
})
izvozrazreda PostModule {}
Ovaj kod registrira PostService, Rukovatelji naredbama, i Rukovatelji upitima u pružatelji usluga niz. Upotreba operatora širenja (...) je spojiti nizove od upit rukovatelji i naredba rukovatelji u pružatelji usluga niz.
Izvršite naredbe i upite
Registrirane naredbe i rukovatelji upitima mogu se koristiti u kontrolerima. Sljedeći kod je implementacija a postovi kontroler koji će prihvaćati HTTP zahtjeve i vraćati potrebne odgovore.
// posts.controller.ts
uvoz {Tijelo, Kontrolor, Post} iz'@nestjs/common';
uvoz {CommandBus} iz'@nestjs/cqrs';
uvoz { CreatePostCommand } iz'./createPostCommand.command.ts';// kontroler koji implementira naredbu
@Kontroler('postovi')
izvozrazreda PostController {
konstruktor(privatna samo za čitanje CommandBus: CommandBus) {}
@Post()
asinkroni createPost(@Tijelo() tijelo: { naslov: niz; sadržaj: niz }) {
konst { naslov, sadržaj } = tijelo;
konst naredba = novi CreatePostCommand (naslov, sadržaj);
konst post = čekatiovaj.commandBus.execute (naredba);
povratak post;
}
}
U gornjem kodu, CommandBus izvršava CreatePostCommand i stvara novi post.
Ovaj kod pokazuje kako implementirati kontroler koji koristi upit:
// posts.controller.ts
uvoz { Controller, Get, Param } iz'@nestjs/common';
uvoz {QueryBus} iz'@nestjs/cqrs';
uvoz { GetPostQuery } iz'./getPostQuery.query';@Kontroler('postovi')
izvozrazreda PostController {
konstruktor(privatna samo za čitanje queryBus: QueryBus) {}
@Dobiti(':iskaznica')
asinkroni getPost(@Param('iskaznica') iskaznica: broj) {
konst upit = novi GetPostQuery (id);
konst post = čekatiovaj.queryBus.execute (upit);
povratak post;
}
}
The queryBus izvršava GetPostQuery koja dobiva objavu s danim ID-om i vraća je.
Nakon što dovršite sve gore navedene korake, sada biste trebali imati minimalističku, funkcionalnu aplikaciju za stvaranje i dohvaćanje postova na blogu.
Iako kod ovdje koristi niz za pohranu stvorenih postova u memoriju, veća je vjerojatnost da ćete koristiti bazu podataka u proizvodnji. Možete koristiti ili a SQL baza podataka, ili a NoSQL baza podataka poput MongoDB-a, jer NestJS podržava obje opcije.
Izrada API-ja s CQRS uzorkom dizajna
Uključivanje uzorka dizajna CQRS u vašu NestJS aplikaciju može pomoći u skalabilnosti, izvedbi i lakoći održavanja. CQRS omogućuje učinkovitije i optimizirane operacije odvajanjem operacija čitanja i pisanja koje aplikacija provodi.
Paket @nestjs/cqrs pruža građevni blok za implementaciju CQRS-a u NestJS s naredbama i rukovateljima upitima. Općenito, CQRS je moćan obrazac koji može pomoći u stvaranju učinkovitijih i skalabilnijih aplikacija i trebali biste odvagnuti svoje mogućnosti prije nego što ga upotrijebite.