Ostrożnie używaj wzorca CQRS, a będziesz mógł tworzyć czystsze, bardziej skalowalne aplikacje Nest.

Powszechnym podejściem do rozwoju NestJS jest budowanie usług, z którymi komunikują się kontrolerzy w celu uzyskania dostępu do danych. Ale to podejście nie jest jedynym prawidłowym wzorcem projektowym w NestJS. Istnieją inne wzorce projektowe, takie jak wzorzec projektowy CQRS.

CQRS to wzorzec projektowy, który oddziela operacje odczytu i zapisu aplikacji. Ta separacja może pomóc poprawić skalowalność, wydajność i łatwość konserwacji.

Dowiedz się wszystkiego o CQRS i o tym, jak możesz go zastosować podczas tworzenia API NestJS.

Co to jest CQRS?

CQRS oznacza segregacja odpowiedzialności za polecenie-zapytanie. Implementuje użycie polecenia do tworzenia, aktualizowania i usuwania danych oraz zapytania aby pobrać dane. Pomaga to wyeliminować potrzebę implementacji wywołań bazy danych aplikacji w usługach.

Umożliwia również wyraźne rozróżnienie pomiędzy logiką odpytywania bazy danych o dane a wykonywaniem innych czynności w aplikacji.

instagram viewer

Podejście CQRS jest przydatne w projektowanie oparte na domenie, co pozwala oddzielić logikę domeny i operacje infrastrukturalne w aplikacji. Można go również użyć do implementacji złożonej logiki biznesowej, ale nie jest to zalecane w przypadku prostszych aplikacji.

Korzystanie z CQRS w interfejsie API NestJS

Możesz użyć wzorca projektowego CQRS w interfejsie API, który budujesz w NestJS. Aby podążać, musisz mieć Node.js zainstalowany na twoim komputerze i najnowszą wersję NestJS.

Wykonaj poniższe kroki, aby zbudować prostą aplikację do blogowania, która implementuje wzorzec projektowy CQRS.

Utwórz projekt Nest

Utwórz nowy projekt Nest i wygeneruj plik post zasób dla aplikacji blogowej. Możesz to zrobić, uruchamiając następujące polecenia w terminalu:

zagnieżdż nowe nestjs-cqrs
zagnieżdżaj posty modułu g
gniazda g posty kontrolera
gniazduj posty serwisowe g

Zainstaluj zależności

Po wykonaniu powyższych kroków uruchom to polecenie terminala, aby zainstalować pakiet NestJS CQRS:

npm install --save @nestjs/cqrs

Utwórz usługę pocztową

Dodaj następujący kod do swojego posty.usługi.ts plik do zdefiniowania Poczta klasa.

// posty.service.ts
import { Do wstrzykiwań } z'@nestjs/wspólne';

eksportinterfejs Post {
tytuł: strunowy;
treść: strunowy;
}

@Do wstrzykiwań()
eksportklasa Poczta {
prywatny posty tylko do odczytu: Post[] = [];

utwórz (opublikuj: Opublikuj): Opublikuj {
Ten.posts.push (post);
powrót post;
}

findById (identyfikator: numer): Post {
powrótTen.posty.znajdź(post => identyfikator postu);
}
}

The Poczta definiuje tworzyć I znajdźWgId metody, aby utworzyć nowy post i pobrać istniejący post z jego identyfikatora.

Zdefiniuj polecenia i zapytania

Następnym krokiem jest zdefiniowanie zapytań i poleceń, które są podstawą wzorca projektowego CQRS.

w posty katalog, utwórz dwa nowe pliki: utwórz PostCommand.command.ts I getPostQuery.query.ts. Plik poleceń powinien wyglądać następująco:

// utwórzPostCommand.command.ts
eksportklasa CreatePostCommand {
konstruktor(publiczny tytuł tylko do odczytu: strunowy, publiczny zawartość tylko do odczytu: strunowy) {}
}

A plik definicji zapytania, taki jak ten:

// getPostQuery.query.ts
eksportklasa GetPostQuery {
konstruktor(publiczny identyfikator tylko do odczytu: numer) {}
}

Tworzenie programów obsługi poleceń i zapytań

Po pomyślnym zdefiniowaniu poleceń i zapytań należy utworzyć dla nich procedury obsługi. Program obsługi to funkcja, która uruchamia polecenie lub zapytanie i zwraca wynik.

Stwórz handlers.ts plik w swoim post katalog i wklej w nim następujący kod:

// handlers.ts
import { CommandHandler, ICommandHandler } z'@nestjs/cqrs';
import { CreatePostCommand } z„./createPostCommand.command.ts”;
import { Poczta } z'./Poczta';

@CommandHandler(CreatePostCommand)
eksportklasa CreatePostHandler przybory ICommandHandler {
konstruktor(prywatny usługa pocztowa tylko do odczytu: usługa pocztowa) {}

asynchroniczny wykonaj (polecenie: CreatePostCommand) {
konst { nazwa, cena } = polecenie;
konst poczta = czekać naTen.postService.create (tytuł, treść);
powrót post;
}
}

W tym samym handlers.ts plik, możesz zmodyfikować instrukcje importu, aby uwzględnić poniższe, aby umożliwić pracę z zapytaniami. Następnie możesz zaimplementować procedurę obsługi zapytań, jak pokazano w poniższym kodzie:

// handler.ts
import { QueryHandler, IQueryHandler} z'@nestjs/cqrs';
import { GetPostQuery } z'./getPostQuery.query';
import { Poczta } z'./Poczta';

// obsługa zapytań
@QueryHandler(GetProductQuery)
eksportklasa GetPostHandler przybory IQueryHandler {
konstruktor(prywatny usługa pocztowa tylko do odczytu: usługa pocztowa) {}

asynchroniczny wykonaj (zapytanie: GetPostQuery) {
konst { identyfikator } = zapytanie;
konst poczta = czekać naTen.postService.findOneById (identyfikator);
powrót post;
}
}

Zarejestruj Handlarzy

Ostatnim krokiem jest zarejestrowanie obsługi poleceń i zapytań w module NestJS.

// post.module.ts
import { Moduł } z'@nestjs/wspólne';
import { Programy obsługi poleceń, programy obsługi zapytań } z'handlers.ts';
import { Poczta } z'./Poczta';

@Moduł({
dostawcy: [
Poczta,
...programy obsługi poleceń,
...Programy obsługi zapytań,
],
})
eksportklasa Moduł postu {}

Ten kod rejestruje Poczta, Programy obsługi poleceń, I Programy obsługi zapytań w dostawcy szyk. Użycie operatora rozprzestrzeniania (...) polega na scaleniu tablic zapytanie obsługi i Komenda obsługi w dostawcy szyk.

Wykonywanie poleceń i zapytań

Zarejestrowane polecenia i procedury obsługi zapytań są użyteczne w kontrolerach. Poniższy kod jest implementacją a posty kontroler, który będzie akceptował żądania HTTP i zwracał wymagane odpowiedzi.

// posty.kontroler.ts
import { Treść, kontroler, wpis } z'@nestjs/wspólne';
import { Magistrala poleceń} z'@nestjs/cqrs';
import { CreatePostCommand } z„./createPostCommand.command.ts”;

// kontroler implementujący polecenie
@Kontroler(„posty”)
eksportklasa Kontroler poczty {
konstruktor(prywatny tylko do odczytu commandbus: CommandBus) {}

@Post()
asynchroniczny utwórzPost(@Ciało() treść: { tytuł: strunowy; treść: strunowy }) {
konst { tytuł, treść } = treść;
konst polecenie = nowy CreatePostCommand (tytuł, treść);
konst poczta = czekać naTen.commandBus.execute (polecenie);
powrót post;
}
}

W powyższym kodzie plik CommandBus wykonuje Polecenie UtwórzPost i tworzy nowy wpis.

Ten kod pokazuje, jak zaimplementować kontroler korzystający z zapytania:

// posty.kontroler.ts
import { Kontroler, Pobierz, Parametr } z'@nestjs/wspólne';
import { QueryBus} z'@nestjs/cqrs';
import { GetPostQuery } z'./getPostQuery.query';

@Kontroler(„posty”)
eksportklasa Kontroler poczty {
konstruktor(prywatny QueryBus tylko do odczytu: QueryBus) {}

@Dostawać(':ID')
asynchroniczny pobierzPost(@Param('ID') ID: numer) {
konst zapytanie = nowy GetPostQuery (identyfikator);
konst poczta = czekać naTen.queryBus.execute (zapytanie);
powrót post;
}
}

The zapytanieBus wykonuje GetPostQuery który pobiera post z podanym identyfikatorem i zwraca go.

Po wykonaniu wszystkich powyższych kroków powinieneś mieć minimalistyczną, działającą aplikację do tworzenia i pobierania postów na blogu.

Chociaż kod tutaj wykorzystuje tablicę do przechowywania utworzonych postów w pamięci, bardziej prawdopodobne jest użycie bazy danych w środowisku produkcyjnym. Możesz albo użyć A Baza danych SQLlub a Baza danych NoSQL, taka jak MongoDB, ponieważ NestJS obsługuje obie opcje.

Tworzenie interfejsów API za pomocą wzorca projektowego CQRS

Włączenie wzorca projektowego CQRS do aplikacji NestJS może pomóc w skalowalności, wydajności i łatwości konserwacji. CQRS pozwala na wydajniejsze i zoptymalizowane operacje poprzez oddzielenie operacji odczytu i zapisu wykonywanych przez aplikację.

Pakiet @nestjs/cqrs zapewnia blok konstrukcyjny do implementacji CQRS w NestJS z poleceniami i procedurami obsługi zapytań. Ogólnie rzecz biorąc, CQRS to potężny wzorzec, który może pomóc w tworzeniu bardziej wydajnych i skalowalnych aplikacji, dlatego przed użyciem należy rozważyć opcje.