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.

instagram viewer

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.