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.

instagram viewer

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.