Previdno uporabljajte vzorec CQRS in ustvarili boste čistejše, bolj razširljive aplikacije Nest.

Pogost pristop k razvoju NestJS je izgradnja storitev, s katerimi krmilniki komunicirajo za dostop do podatkov. Vendar ta pristop ni edini veljaven vzorec oblikovanja v NestJS. Obstajajo tudi drugi vzorci oblikovanja, kot je vzorec oblikovanja CQRS.

CQRS je vzorec načrtovanja, ki ločuje operacije branja in pisanja aplikacije. Ta ločitev lahko pomaga izboljšati razširljivost, zmogljivost in vzdržljivost.

Poiščite vse o CQRS in o tem, kako ga lahko uporabite pri izdelavi API-ja NestJS.

Kaj je CQRS?

CQRS pomeni ločitev odgovornosti ukaz-poizvedba. Izvaja uporabo ukazi za ustvarjanje, posodabljanje in brisanje podatkov ter poizvedbe za pridobivanje podatkov. To pomaga odpraviti potrebo po implementaciji klicev baze podatkov aplikacije v storitve.

Omogoča tudi jasno razlikovanje med logiko poizvedovanja podatkov po bazi podatkov in izvajanjem drugih dejanj v aplikaciji.

Pristop CQRS je uporaben pri domensko usmerjeno oblikovanje

, ki vam omogoča ločevanje domenske logike in infrastrukturnih operacij v vaši aplikaciji. Uporabite ga lahko tudi za implementacijo kompleksne poslovne logike, vendar to ni priporočljivo za preprostejše aplikacije.

Uporaba CQRS v API-ju NestJS

Oblikovalni vzorec CQRS lahko uporabite v API-ju, ki ga zgradite v NestJS. Če želite slediti, morate imeti Node.js nameščen v vašem računalniku in najnovejšo različico NestJS.

Z naslednjimi koraki zgradite preprosto aplikacijo za bloganje, ki izvaja vzorec oblikovanja CQRS.

Ustvarite projekt Nest

Ustvarite nov projekt Nest in ustvarite a post vir za blog aplikacijo. To lahko storite tako, da v terminalu zaženete naslednje ukaze:

ugnezdite nov nestjs-cqrs
modul nest g
nest g krmilna mesta
gnezdo g servisna mesta

Namestitev odvisnosti

Ko dokončate zgornje korake, zaženite ta terminalski ukaz, da namestite paket NestJS CQRS:

npm install --save @nestjs/cqrs

Ustvarite poštno storitev

Svoji dodajte naslednjo kodo posts.service.ts datoteko za določitev PostService razred.

// posts.service.ts
uvoz { Za injiciranje } od'@nestjs/common';

izvozvmesnik Objava {
naslov: vrvica;
vsebina: vrvica;
}

@Za injiciranje()
izvozrazred PostService {
zasebno objave samo za branje: objava [] = [];

ustvari (objava: Objava): Objava {
to.posts.push (objava);
vrnitev post;
}

findById (id: število): Objavi {
vrnitevto.posts.find(post => post.id id);
}
}

The PostService opredeljuje ustvariti in findById metode za ustvarjanje nove objave in pridobivanje obstoječe objave iz njenega ID-ja.

Definirajte ukaze in poizvedbe

Naslednji korak je definiranje poizvedb in ukazov, ki so jedro oblikovalskega vzorca CQRS.

V objave ustvarite dve novi datoteki: ustvariPostCommand.command.ts in getPostQuery.query.ts. Ukazna datoteka bi morala izgledati takole:

// createPostCommand.command.ts
izvozrazred CreatePostCommand {
konstruktor(javnosti naslov samo za branje: vrvica, javnosti vsebina samo za branje: vrvica) {}
}

In datoteka z definicijo poizvedbe, kot je ta:

// getPostQuery.query.ts
izvozrazred GetPostQuery {
konstruktor(javnosti ID samo za branje: število) {}
}

Ustvarite obdelovalce ukazov in poizvedb

Ko ste uspešno definirali svoje ukaze in poizvedbe, morate ustvariti upravljalnike zanje. Obravnavalnik je funkcija, ki zažene ukaz ali poizvedbo in vrne rezultat.

Ustvariti handlers.ts datoteko v vašem post imenik in vanj prilepite naslednjo kodo:

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

@CommandHandler(CreatePostCommand)
izvozrazred CreatePostHandler pripomočke ICommandHandler {
konstruktor(zasebno postService samo za branje: PostService) {}

asinh izvedi (ukaz: CreatePostCommand) {
konst { ime, cena } = ukaz;
konst objava = čakatito.postService.create (naslov, vsebina);
vrnitev post;
}
}

V istem handlers.ts datoteko, lahko spremenite uvozne stavke tako, da vključujejo spodnje, da omogočite delo s poizvedbami. Nato lahko implementirate obravnavo poizvedbe, kot je prikazano v spodnji kodi:

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

// obdelava poizvedbe
@QueryHandler(GetProductQuery)
izvozrazred GetPostHandler pripomočke IQueryHandler {
konstruktor(zasebno postService samo za branje: PostService) {}

asinh izvrši (poizvedba: GetPostQuery) {
konst { id } = poizvedba;
konst objava = čakatito.postService.findOneById (id);
vrnitev post;
}
}

Obdelovalci registra

Zadnji korak je registracija obdelovalcev ukazov in poizvedb z modulom NestJS.

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

@Modul({
ponudniki: [
PostService,
...CommandHandlers,
... QueryHandlers,
],
})
izvozrazred PostModule {}

Ta koda registrira PostService, CommandHandlers, in QueryHandlers v ponudniki niz. Uporaba operatorja širjenja (...) je združiti nize poizvedbo vodniki in ukaz upravljavci v ponudniki niz.

Izvajanje ukazov in poizvedb

Registrirani ukazi in obdelovalci poizvedb so uporabni v krmilnikih. Naslednja koda je implementacija a objave krmilnik, ki bo sprejemal zahteve HTTP in vračal zahtevane odgovore.

// posts.controller.ts
uvoz {Telo, krmilnik, objava} od'@nestjs/common';
uvoz {CommandBus} od'@nestjs/cqrs';
uvoz { CreatePostCommand } od'./createPostCommand.command.ts';

// krmilnik, ki izvaja ukaz
@Krmilnik('objave')
izvozrazred PostController {
konstruktor(zasebno samo za branje commandBus: CommandBus) {}

@Objava()
asinh createPost(@Telo() telo: { naslov: vrvica; vsebina: vrvica }) {
konst { naslov, vsebina } = telo;
konst ukaz = novo CreatePostCommand (naslov, vsebina);
konst objava = čakatito.commandBus.execute (ukaz);
vrnitev post;
}
}

V zgornji kodi je CommandBus izvaja CreatePostCommand in ustvari novo objavo.

Ta koda prikazuje, kako implementirati krmilnik, ki uporablja poizvedbo:

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

@Krmilnik('objave')
izvozrazred PostController {
konstruktor(zasebno samo za branje queryBus: QueryBus) {}

@Get(':id')
asinh getPost(@Param('id') id: število) {
konst poizvedba = novo GetPostQuery (id);
konst objava = čakatito.queryBus.execute (poizvedba);
vrnitev post;
}
}

The queryBus izvaja GetPostQuery ki dobi objavo z danim ID-jem in jo vrne.

Ko dokončate vse zgornje korake, bi morali zdaj imeti minimalistično delujočo aplikacijo za ustvarjanje in pridobivanje objav v spletnem dnevniku.

Čeprav koda tukaj uporablja matriko za shranjevanje ustvarjenih objav v pomnilniku, je bolj verjetno, da boste v proizvodnji uporabili bazo podatkov. Uporabite lahko a Baza podatkov SQL, ali a Baza podatkov NoSQL, kot je MongoDB, saj NestJS podpira obe možnosti.

Gradnja API-jev z vzorcem oblikovanja CQRS

Vključitev oblikovalskega vzorca CQRS v vašo aplikacijo NestJS lahko pomaga pri razširljivosti, zmogljivosti in vzdržljivosti. CQRS omogoča učinkovitejše in optimizirane operacije z ločevanjem operacij branja in pisanja, ki jih izvaja aplikacija.

Paket @nestjs/cqrs zagotavlja gradnik za implementacijo CQRS v NestJS z ukazi in obdelovalniki poizvedb. Na splošno je CQRS zmogljiv vzorec, ki lahko pomaga ustvariti učinkovitejše in razširljive aplikacije, zato morate pred uporabo pretehtati svoje možnosti.