Használja körültekintően a CQRS-mintát, és tisztább, jobban méretezhető Nest-alkalmazásokat hozhat létre.
A NestJS fejlesztésének általános megközelítése az, hogy olyan szolgáltatásokat építenek ki, amelyekkel a vezérlők kommunikálnak az adatokhoz való hozzáférés érdekében. De ez a megközelítés nem az egyetlen érvényes tervezési minta a NestJS-ben. Vannak más tervezési minták is, például a CQRS tervezési minta.
A CQRS egy tervezési minta, amely elválasztja egy alkalmazás olvasási és írási műveleteit. Ez a szétválasztás segíthet a méretezhetőség, a teljesítmény és a karbantarthatóság javításában.
Tudjon meg mindent a CQRS-ről és arról, hogyan alkalmazhatja azt a NestJS API felépítése során.
Mi az a CQRS?
CQRS jelentése parancs-lekérdezés felelősség elkülönítése. Használatát valósítja meg parancsokat adatok létrehozásához, frissítéséhez és törléséhez és lekérdezések adatok lekérésére. Ez segít elkerülni annak szükségességét, hogy egy alkalmazás adatbázis-hívásait a szolgáltatásokba beépítse.
Lehetővé teszi továbbá, hogy világos különbséget tegyen az adatbázisból az adatok lekérdezésének logikája és az alkalmazásban végzett egyéb műveletek logikája között.
A CQRS megközelítés hasznos domain-vezérelt tervezés, amely lehetővé teszi a tartomány logikai és infrastrukturális műveleteinek elkülönítését az alkalmazásban. Komplex üzleti logika megvalósítására is használható, de egyszerűbb alkalmazásoknál ez nem javasolt.
CQRS használata NestJS API-ban
A CQRS tervezési mintát a NestJS-ben felépített API-ban használhatja. Ahhoz, hogy kövessen, rendelkeznie kell Node.js telepítve van a számítógépére és a NestJS legújabb verziója.
A következő lépésekkel készíthet egy egyszerű blogolási alkalmazást, amely megvalósítja a CQRS tervezési mintát.
Hozzon létre egy Nest-projektet
Hozzon létre egy új Nest-projektet, és hozzon létre a hozzászólás forrás egy blogalkalmazáshoz. Ezt a következő parancsok futtatásával teheti meg egy terminálon:
nest new nestjs-cqrs
Nest g modul bejegyzései
nest g vezérlőposztok
fészek g szolgálati állások
Függőségek telepítése
A fenti lépések végrehajtása után futtassa ezt a terminálparancsot a NestJS CQRS csomag telepítéséhez:
npm install --save @nestjs/cqrs
Hozzon létre egy postaszolgálatot
Adja hozzá a következő kódot a sajátjához posts.service.ts fájlt a PostService osztály.
// posts.service.ts
import { Injekciós } tól től"@nestjs/common";exportfelület bejegyzés {
cím: húr;
tartalom: húr;
}@Injektálható()
exportosztály PostService {
magán csak olvasható hozzászólások: Bejegyzés[] = [];létrehozás (bejegyzés: bejegyzés): közzététel {
ez.posts.push (post);
Visszatérés posta;
}
findById (azonosító: szám): Hozzászólás {
Visszatérésez.posts.find(hozzászólás => post.id id);
}
}
A PostService meghatározza teremt és findById módszerek új bejegyzés létrehozására és egy meglévő bejegyzés lekérésére az azonosítójából.
Parancsok és lekérdezések meghatározása
A következő lépés a CQRS tervezési minta alapját képező lekérdezések és parancsok meghatározása.
Ban,-ben hozzászólások könyvtárba, hozzon létre két új fájlt: létrehozniPostCommand.command.ts és getPostQuery.query.ts. A parancsfájlnak így kell kinéznie:
// createPostCommand.command.ts
exportosztály CreatePostCommand {
konstruktőr(nyilvános csak olvasható cím: húr, nyilvános csak olvasható tartalom: húr) {}
}
És a lekérdezésdefiníciós fájl, például:
// getPostQuery.query.ts
exportosztály GetPostQuery {
konstruktőr(nyilvános csak olvasható azonosító: szám) {}
}
Parancs- és lekérdezéskezelők létrehozása
Miután sikeresen meghatározta a parancsokat és lekérdezéseket, kezelőket kell létrehoznia hozzájuk. A kezelő egy függvény, amely parancsot vagy lekérdezést futtat, és visszaadja az eredményt.
Hozzon létre egy kezelők.ts fájlt a tiédben hozzászólás könyvtárba, és illessze be a következő kódot:
// handlers.ts
import { CommandHandler, ICommandHandler } tól től"@nestjs/cqrs";
import { CreatePostCommand } tól től'./createPostCommand.command.ts';
import { PostService } tól től"./post.service";@CommandHandler(CreatePostCommand)
exportosztály CreatePostHandler megvalósítja ICommandHandler{
konstruktőr(magán csak olvasható postService: PostService) {}
async execute (parancs: CreatePostCommand) {
const { név, ár } = parancs;
const hozzászólás = várjaez.postService.create (cím, tartalom);
Visszatérés posta;
}
}
Ugyanabban a kezelők.ts fájlban módosíthatja az importálási utasításokat, hogy azok tartalmazzák az alábbiakat is, hogy lehetővé tegye a lekérdezések kezelését. Ezután megvalósíthatja a lekérdezéskezelőt az alábbi kód szerint:
// handler.ts
import { QueryHandler, IQueryHandler } tól től"@nestjs/cqrs";
import { GetPostQuery } tól től'./getPostQuery.query';
import { PostService } tól től"./post.service";// lekérdezéskezelő
@QueryHandler(GetProductQuery)
exportosztály GetPostHandler megvalósítja IQueryHandler{
konstruktőr(magán csak olvasható postService: PostService) {}
async végrehajt (lekérdezés: GetPostQuery) {
const { id } = lekérdezés;
const hozzászólás = várjaez.postService.findOneById (id);
Visszatérés posta;
}
}
Regisztrációs kezelők
Az utolsó lépés a parancs- és lekérdezéskezelők regisztrálása a NestJS modullal.
// post.module.ts
import { Modul } tól től"@nestjs/common";
import { CommandHandlers, QueryHandlers } tól től"handlers.ts";
import { PostService } tól től"./post.service";
@Modul({
szolgáltatók: [
Postaszolgálat,
...Command Handlers,
...QueryHandlers,
],
})
exportosztály PostModule {}
Ez a kód regisztrálja a PostService, Parancskezelők, és QueryHandlers ban,-ben szolgáltatók sor. A spread operátor használata (...) a tömbök egyesítése lekérdezés kezelők és parancs kezelők a szolgáltatók sor.
Parancsok és lekérdezések végrehajtása
A regisztrált parancsok és lekérdezéskezelők a vezérlőkben használhatók. A következő kód az a hozzászólások vezérlő, amely elfogadja a HTTP kéréseket és visszaadja a szükséges válaszokat.
// posts.controller.ts
import { Törzs, vezérlő, bejegyzés } tól től"@nestjs/common";
import { CommandBus } tól től"@nestjs/cqrs";
import { CreatePostCommand } tól től'./createPostCommand.command.ts';// parancsot végrehajtó vezérlő
@Vezérlő("bejegyzések")
exportosztály PostController {
konstruktőr(magán csak olvasható commandBus: CommandBus) {}
@Post()
async createPost(@Test() törzs: { cím: húr; tartalom: húr }) {
const { cím, tartalom } = törzs;
const parancs = új CreatePostCommand (cím, tartalom);
const hozzászólás = várjaez.commandBus.execute (parancs);
Visszatérés posta;
}
}
A fenti kódban a CommandBus végrehajtja a CreatePostCommand és új bejegyzést hoz létre.
Ez a kód megmutatja, hogyan kell megvalósítani egy lekérdezést használó vezérlőt:
// posts.controller.ts
import { Controller, Get, Param } tól től"@nestjs/common";
import { QueryBus } tól től"@nestjs/cqrs";
import { GetPostQuery } tól től'./getPostQuery.query';@Vezérlő("bejegyzések")
exportosztály PostController {
konstruktőr(magán csak olvasható queryBus: QueryBus) {}
@Kap(':id')
async getPost(@Param("azonosító") id: szám) {
const lekérdezés = új GetPostQuery (id);
const hozzászólás = várjaez.queryBus.execute (lekérdezés);
Visszatérés posta;
}
}
A queryBus kivégzi GetPostQuery amely a megadott azonosítóval megkapja a posztot és visszaküldi.
A fenti lépések végrehajtása után egy minimalista, működő alkalmazással kell rendelkeznie blogbejegyzések létrehozásához és lekéréséhez.
Bár az itt található kód egy tömb segítségével tárolja a létrehozott bejegyzéseket a memóriában, nagyobb valószínűséggel használ adatbázist az éles környezetben. Használhatja a SQL adatbázis, vagy a NoSQL adatbázis, mint a MongoDB, mivel a NestJS mindkét lehetőséget támogatja.
API-k építése CQRS tervezési mintával
A CQRS tervezési mintának a NestJS alkalmazásba való beépítése elősegítheti a méretezhetőséget, a teljesítményt és a karbantarthatóságot. A CQRS hatékonyabb és optimalizáltabb műveleteket tesz lehetővé azáltal, hogy elválasztja az alkalmazás által végrehajtott olvasási és írási műveleteket.
A @nestjs/cqrs csomag építőelemet biztosít a CQRS megvalósításához a NestJS-ben parancsokkal és lekérdezéskezelőkkel. Összességében a CQRS egy hatékony minta, amely segíthet hatékonyabb és skálázhatóbb alkalmazások létrehozásában, ezért használat előtt mérlegelnie kell a lehetőségeit.