Atsargiai naudokite CQRS šabloną ir galėsite kurti švaresnes, labiau keičiamo dydžio „Nest“ programas.
Įprastas „NestJS“ kūrimo metodas yra kurti paslaugas, su kuriomis valdytojai bendrauja norėdami pasiekti duomenis. Tačiau šis metodas nėra vienintelis tinkamas „NestJS“ dizaino modelis. Yra ir kitų dizaino modelių, tokių kaip CQRS dizaino modelis.
CQRS yra dizaino modelis, atskiriantis programos skaitymo ir rašymo operacijas. Šis atskyrimas gali padėti pagerinti mastelį, našumą ir priežiūrą.
Sužinokite viską apie CQRS ir kaip galite jį pritaikyti kurdami NestJS API.
Kas yra CQRS?
CQRS reiškia komandų ir užklausų atsakomybės atskyrimas. Jis įgyvendina naudojimą komandas kurti, atnaujinti ir ištrinti duomenis ir užklausų gauti duomenis. Tai padeda pašalinti poreikį įdiegti programos duomenų bazės skambučius į paslaugas.
Tai taip pat leidžia aiškiai atskirti duomenų užklausos duomenų bazėje logiką ir kitų veiksmų programoje atlikimą.
CQRS metodas yra naudingas domenu pagrįstas dizainas, kuri leidžia atskirti domeno logiką ir infrastruktūros operacijas jūsų programoje. Taip pat galite jį naudoti sudėtingai verslo logikai įgyvendinti, tačiau tai nerekomenduojama paprastesnėms programoms.
CQRS naudojimas „NestJS“ API
Galite naudoti CQRS dizaino šabloną API, kurią kuriate naudodami NestJS. Norėdami sekti, turite turėti Jūsų kompiuteryje įdiegtas Node.js ir naujausia NestJS versija.
Atlikite šiuos veiksmus, kad sukurtumėte paprastą dienoraščio rašymo programą, kuri įgyvendina CQRS dizaino modelį.
Sukurkite „Nest“ projektą
Sukurkite naują „Nest“ projektą ir sugeneruokite a paštu tinklaraščio programos išteklius. Tai galite padaryti terminale vykdydami šias komandas:
nest new nestjs-cqrs
Nest g modulio įrašai
nest g valdiklio postai
Nest g aptarnavimo postai
Įdiekite priklausomybes
Atlikę aukščiau nurodytus veiksmus, paleiskite šią terminalo komandą, kad įdiegtumėte NestJS CQRS paketą:
npm įdiegti – išsaugoti @nestjs/cqrs
Sukurkite pašto tarnybą
Pridėkite šį kodą prie savo posts.service.ts failą, kad apibrėžtumėte Pašto paslauga klasė.
// posts.service.ts
importuoti { Injekcinis } iš„@nestjs/common“;eksportuotisąsaja Paskelbti {
pavadinimas: styga;
turinys: styga;
}@Injekcinis()
eksportuotiklasė PostService {
privatus tik skaitomi pranešimai: Post[] = [];sukurti (post: Paskelbti): Paskelbti {
tai.posts.push (post);
grąžinti paštas;
}
findById (id: numerį): Paskelbti {
grąžintitai.posts.find(paštu => post.id id);
}
}
The Pašto paslauga apibrėžia sukurti ir findById metodus, kaip sukurti naują įrašą ir gauti esamą įrašą iš jo ID.
Apibrėžkite komandas ir užklausas
Kitas žingsnis yra apibrėžti užklausas ir komandas, kurios yra CQRS projektavimo modelio pagrindas.
Viduje pranešimų kataloge, sukurkite du naujus failus: sukurtiPostCommand.command.ts ir getPostQuery.query.ts. Komandos failas turėtų atrodyti taip:
// CreatePostCommand.command.ts
eksportuotiklasė CreatePostCommand {
konstruktorius(viešas tik skaitomas pavadinimas: styga, viešas tik skaitomas turinys: styga) {}
}
Ir užklausos apibrėžimo failas, pavyzdžiui:
// getPostQuery.query.ts
eksportuotiklasė GetPostQuery {
konstruktorius(viešas skaitomas ID: numerį) {}
}
Sukurkite komandų ir užklausų tvarkykles
Sėkmingai apibrėžę komandas ir užklausas, turite sukurti joms tvarkykles. Valdiklis yra funkcija, kuri vykdo komandą arba užklausą ir grąžina rezultatą.
Sukurti tvarkytojai.ts failą savo paštu katalogą ir įklijuokite į jį šį kodą:
// tvarkytojai.ts
importuoti { CommandHandler, ICommandHandler } iš„@nestjs/cqrs“;
importuoti { CreatePostCommand } iš'./createPostCommand.command.ts';
importuoti { Pašto paslauga } iš„./post.service“;@CommandHandler(CreatePostCommand)
eksportuotiklasė CreatePostHandler padargai ICommandHandler{
konstruktorius(privatus skaitoma postService: PostService) {}
async vykdyti (komanda: CreatePostCommand) {
konst {pavadinimas, kaina} = komanda;
konst paštas = lauktitai.postService.create (pavadinimas, turinys);
grąžinti paštas;
}
}
Tame pačiame tvarkytojai.ts failą, galite modifikuoti importavimo teiginius, įtraukdami toliau nurodytus, kad galėtumėte dirbti su užklausomis. Tada galite įdiegti užklausų tvarkyklę, kaip parodyta toliau pateiktame kode:
// tvarkytojas.ts
importuoti { QueryHandler, IQueryHandler } iš„@nestjs/cqrs“;
importuoti { GetPostQuery } iš„./getPostQuery.query“;
importuoti { Pašto paslauga } iš„./post.service“;// užklausų tvarkytuvė
@QueryHandler(GetProductQuery)
eksportuotiklasė GetPostHandler padargai IQueryHandler{
konstruktorius(privatus skaitoma postService: PostService) {}
async vykdyti (užklausa: GetPostQuery) {
konst { id } = užklausa;
konst paštas = lauktitai.postService.findOneById (id);
grąžinti paštas;
}
}
Registrų tvarkytojai
Paskutinis veiksmas yra užregistruoti komandų ir užklausų tvarkykles su NestJS moduliu.
// post.module.ts
importuoti { Modulis } iš„@nestjs/common“;
importuoti { CommandHandlers, QueryHandlers } iš'handlers.ts';
importuoti { Pašto paslauga } iš„./post.service“;
@Modulis({
teikėjai: [
Pašto paslauga,
...Command Handlers,
...QueryHandlers,
],
})
eksportuotiklasė PostModule {}
Šis kodas registruoja Pašto paslauga, Komandų tvarkytojai, ir Užklausų tvarkytojai viduje teikėjai masyvas. Sklaidos operatoriaus naudojimas (...) yra sujungti masyvus užklausą tvarkytojai ir komandą tvarkytojai į teikėjai masyvas.
Vykdykite komandas ir užklausas
Užregistruotos komandos ir užklausų tvarkyklės gali būti naudojamos valdikliuose. Šis kodas yra a įgyvendinimas pranešimų valdiklis, kuris priims HTTP užklausas ir grąžins reikiamus atsakymus.
// posts.controller.ts
importuoti { Body, Controller, Post } iš„@nestjs/common“;
importuoti { CommandBus } iš„@nestjs/cqrs“;
importuoti { CreatePostCommand } iš'./createPostCommand.command.ts';// valdiklis, įgyvendinantis komandą
@Controller("įrašai")
eksportuotiklasė PostController {
konstruktorius(privatus skaitoma komandų magistralė: CommandBus) {}
@Įrašas()
async CreatePost(@Kūnas() body: { title: styga; turinys: styga }) {
konst {pavadinimas, turinys} = tekstas;
konst komanda = naujas CreatePostCommand (pavadinimas, turinys);
konst paštas = lauktitai.commandBus.execute (komanda);
grąžinti paštas;
}
}
Aukščiau pateiktame kode CommandBus vykdo CreatePostCommand ir sukuria naują įrašą.
Šis kodas parodo, kaip įdiegti valdiklį, kuris naudoja užklausą:
// posts.controller.ts
importuoti { Valdiklis, gauti, parametras } iš„@nestjs/common“;
importuoti { QueryBus } iš„@nestjs/cqrs“;
importuoti { GetPostQuery } iš„./getPostQuery.query“;@Controller("įrašai")
eksportuotiklasė PostController {
konstruktorius(privatus skaitoma queryBus: QueryBus) {}
@Gauti(':id')
async getPost(@Param('id') ID: numerį) {
konst užklausa = naujas GetPostQuery (id);
konst paštas = lauktitai.queryBus.execute (užklausa);
grąžinti paštas;
}
}
The queryBus vykdo GetPostQuery kuri gauna įrašą su nurodytu ID ir grąžina jį.
Atlikę visus aukščiau nurodytus veiksmus, dabar turėtumėte turėti minimalistinę veikiančią programą tinklaraščio įrašams kurti ir gauti.
Nors čia esantis kodas naudoja masyvą sukurtiems įrašams saugoti atmintyje, labiau tikėtina, kad gamyboje naudosite duomenų bazę. Galite naudoti arba a SQL duomenų bazė, arba a NoSQL duomenų bazė, tokia kaip MongoDB, nes „NestJS“ palaiko abi parinktis.
API kūrimas naudojant CQRS dizaino modelį
CQRS dizaino modelio įtraukimas į „NestJS“ programą gali padėti padidinti mastelį, našumą ir priežiūrą. CQRS leidžia atlikti efektyvesnes ir optimizuotas operacijas, atskiriant skaitymo ir rašymo operacijas, kurias atlieka programa.
@nestjs/cqrs paketas yra kūrimo blokas, skirtas CQRS įdiegti NestJS naudojant komandas ir užklausų tvarkykles. Apskritai, CQRS yra galingas modelis, galintis padėti sukurti efektyvesnes ir keičiamo dydžio programas, todėl prieš naudodami turėtumėte pasverti savo galimybes.