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.

instagram viewer

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.