Používejte vzor CQRS opatrně a můžete vytvářet čistší a škálovatelnější aplikace Nest.
Běžným přístupem k vývoji NestJS je vytváření služeb, se kterými kontroloři komunikují za účelem přístupu k datům. Tento přístup však není jediným platným návrhovým vzorem v NestJS. Existují další návrhové vzory, například návrhový vzor CQRS.
CQRS je návrhový vzor, který odděluje operace čtení a zápisu aplikace. Toto oddělení může pomoci zlepšit škálovatelnost, výkon a udržovatelnost.
Zjistěte vše o CQRS a o tom, jak jej můžete použít při vytváření rozhraní NestJS API.
Co je CQRS?
CQRS znamená segregace odpovědnosti za příkaz a dotaz. Implementuje použití příkazy vytvářet, aktualizovat a mazat data a dotazy k načtení dat. To pomáhá eliminovat potřebu implementovat databázová volání aplikace do služeb.
Umožňuje také jasné rozlišení mezi logikou dotazování databáze na data a prováděním dalších akcí v aplikaci.
Přístup CQRS je užitečný v doménově řízený design, který vám umožňuje oddělit doménovou logiku a infrastrukturní operace ve vaší aplikaci. Můžete jej také použít k implementaci složité obchodní logiky, ale pro jednodušší aplikace se to nedoporučuje.
Použití CQRS v NestJS API
Návrhový vzor CQRS můžete použít v rozhraní API, které vytvoříte v NestJS. Chcete-li pokračovat, musíte mít Node.js nainstalovaný na vašem počítači a nejnovější verzi NestJS.
Pomocí následujících kroků vytvořte jednoduchou blogovací aplikaci, která implementuje návrhový vzor CQRS.
Vytvořte projekt Nest
Vytvořte nový projekt Nest a vygenerujte a pošta zdroj pro blogovou aplikaci. Můžete to provést spuštěním následujících příkazů v terminálu:
hnízdo nové nestjs-cqrs
nest g modul sloupky
nest g řadiče posty
nest g služebních míst
Nainstalujte závislosti
Po dokončení výše uvedených kroků spusťte tento příkaz terminálu a nainstalujte balíček NestJS CQRS:
npm install --save @nestjs/cqrs
Vytvořte poštovní službu
Přidejte následující kód do svého posts.service.ts soubor k definování PostService třída.
// posts.service.ts
import { Injekční } z'@nestjs/common';vývoznírozhraní Pošta {
titul: tětiva;
obsah: tětiva;
}@Injekční()
vývoznítřída PostService {
soukromé příspěvky pouze pro čtení: Příspěvek[] = [];create (post: Post): Post {
tento.posts.push (post);
vrátit se pošta;
}
findById (id: číslo): Pošta {
vrátit setento.posts.find(pošta => id post.id);
}
}
The PostService definuje vytvořit a findById metody pro vytvoření nového příspěvku a získání existujícího příspěvku z jeho ID.
Definujte příkazy a dotazy
Dalším krokem je definování dotazů a příkazů, které jsou jádrem návrhového vzoru CQRS.
V příspěvky adresář, vytvořte dva nové soubory: vytvořitPostCommand.command.ts a getPostQuery.query.ts. Příkazový soubor by měl vypadat takto:
// createPostCommand.command.ts
vývoznítřída CreatePostCommand {
konstruktér(veřejnost název pouze pro čtení: tětiva, veřejnost obsah pouze pro čtení: tětiva) {}
}
A soubor definice dotazu, jako je tento:
// getPostQuery.query.ts
vývoznítřída GetPostQuery {
konstruktér(veřejnost id pouze pro čtení: číslo) {}
}
Vytvořte obslužné rutiny příkazů a dotazů
Poté, co jste úspěšně definovali své příkazy a dotazy, musíte pro ně vytvořit obslužné rutiny. Obslužná rutina je funkce, která spouští příkaz nebo dotaz a vrací výsledek.
Vytvořit handlers.ts soubor ve vašem pošta adresář a vložte do něj následující kód:
// handlers.ts
import { CommandHandler, ICommandHandler } z'@nestjs/cqrs';
import { CreatePostCommand } z'./createPostCommand.command.ts';
import { PostService } z'./post.service';@CommandHandler(CreatePostCommand)
vývoznítřída CreatePostHandler nářadí ICommandHandler{
konstruktér(soukromé postService pouze pro čtení: PostService) {}
asynchronní vykonat (příkaz: CreatePostCommand) {
konst { název, cena } = příkaz;
konst příspěvek = čekattento.postService.create (název, obsah);
vrátit se pošta;
}
}
Ve stejné handlers.ts můžete upravit příkazy importu tak, aby zahrnovaly níže uvedené, aby bylo možné pracovat s dotazy. Poté můžete implementovat obslužný program dotazu, jak je vidět v níže uvedeném kódu:
// handler.ts
import { QueryHandler, IQueryHandler } z'@nestjs/cqrs';
import { GetPostQuery } z'./getPostQuery.query';
import { PostService } z'./post.service';// obsluha dotazu
@QueryHandler(GetProductQuery)
vývoznítřída GetPostHandler nářadí IQueryHandler{
konstruktér(soukromé postService pouze pro čtení: PostService) {}
asynchronní vykonat (dotaz: GetPostQuery) {
konst { id } = dotaz;
konst příspěvek = čekattento.postService.findOneById (id);
vrátit se pošta;
}
}
Registrovat obslužné osoby
Posledním krokem je registrace obslužných rutin příkazů a dotazů do modulu NestJS.
// post.module.ts
import { Modul } z'@nestjs/common';
import { CommandHandlers, QueryHandlers } z'handlers.ts';
import { PostService } z'./post.service';
@Modul({
poskytovatelé: [
PostService,
...CommandHandlers,
...QueryHandlers,
],
})
vývoznítřída PostModule {}
Tento kód registruje PostService, CommandHandlers, a QueryHandlers v poskytovatelé pole. Použití operátoru spread (...) je sloučit pole dotaz manipulátory a příkaz manipulátory do poskytovatelé pole.
Provádějte příkazy a dotazy
Registrované příkazy a obslužné rutiny dotazů jsou použitelné v ovladačích. Následující kód je implementací a příspěvky řadič, který bude přijímat požadavky HTTP a vracet požadované odpovědi.
// posts.controller.ts
import { Body, Controller, Post } z'@nestjs/common';
import { CommandBus } z'@nestjs/cqrs';
import { CreatePostCommand } z'./createPostCommand.command.ts';// řadič, který implementuje příkaz
@Ovladač('příspěvky')
vývoznítřída PostController {
konstruktér(soukromé pouze pro čtení commandBus: CommandBus) {}
@Pošta()
asynchronní createPost(@Tělo() body: { title: tětiva; obsah: tětiva }) {
konst { nadpis, obsah } = tělo;
konst příkaz = Nový CreatePostCommand (název, obsah);
konst příspěvek = čekattento.commandBus.execute (příkaz);
vrátit se pošta;
}
}
Ve výše uvedeném kódu je CommandBus provede CreatePostCommand a vytvoří nový příspěvek.
Tento kód ukazuje, jak implementovat řadič, který používá dotaz:
// posts.controller.ts
import { Controller, Get, Param } z'@nestjs/common';
import { QueryBus } z'@nestjs/cqrs';
import { GetPostQuery } z'./getPostQuery.query';@Ovladač('příspěvky')
vývoznítřída PostController {
konstruktér(soukromé readonly queryBus: QueryBus) {}
@Dostat(':id')
asynchronní getPost(@Param('id') id: číslo) {
konst dotaz = Nový GetPostQuery (id);
konst příspěvek = čekattento.queryBus.execute (dotaz);
vrátit se pošta;
}
}
The dotaz Bus provádí GetPostQuery který dostane příspěvek s daným ID a vrátí jej.
Po dokončení všech výše uvedených kroků byste nyní měli mít minimalistickou funkční aplikaci pro vytváření a načítání blogových příspěvků.
Přestože zde kód používá pole k ukládání vytvořených příspěvků do paměti, je pravděpodobnější, že ve výrobě použijete databázi. Můžete buď použít a SQL databáze, nebo a NoSQL databáze jako MongoDB, protože NestJS podporuje obě možnosti.
Vytváření rozhraní API s návrhovým vzorem CQRS
Začlenění návrhového vzoru CQRS do vaší aplikace NestJS může pomoci při škálovatelnosti, výkonu a udržovatelnosti. CQRS umožňuje efektivnější a optimalizované operace oddělením operací čtení a zápisu, které aplikace provádí.
Balíček @nestjs/cqrs poskytuje stavební blok pro implementaci CQRS v NestJS s příkazy a obslužnými rutinami dotazů. Celkově je CQRS výkonný vzor, který může pomoci vytvářet efektivnější a škálovatelnější aplikace, a před jeho použitím byste měli zvážit své možnosti.