Use o padrão CQRS com cuidado e você poderá criar aplicativos Nest mais limpos e escaláveis.

Uma abordagem comum para o desenvolvimento do NestJS é criar serviços com os quais os controladores se comunicam para acessar os dados. Mas essa abordagem não é o único padrão de design válido no NestJS. Existem outros padrões de design, como o padrão de design CQRS.

CQRS é um padrão de design que separa as operações de leitura e gravação de um aplicativo. Essa separação pode ajudar a melhorar a escalabilidade, o desempenho e a capacidade de manutenção.

Descubra tudo sobre o CQRS e como aplicá-lo ao criar uma API NestJS.

O que é CQRS?

CQRS apoia segregação de responsabilidade de consulta de comando. Ele implementa o uso de comandos para criar, atualizar e excluir dados e consultas para buscar dados. Isso ajuda a eliminar a necessidade de implementar chamadas de banco de dados de um aplicativo em serviços.

Ele também permite uma distinção clara entre a lógica de consultar o banco de dados em busca de dados e executar outras ações em um aplicativo.

instagram viewer

A abordagem CQRS é útil em design orientado a domínio, que permite separar a lógica de domínio e as operações de infraestrutura em seu aplicativo. Você também pode usá-lo para implementar lógica de negócios complexa, mas isso não é recomendado para aplicativos mais simples.

Usando CQRS em uma API NestJS

Você pode usar o padrão de design CQRS em uma API construída no NestJS. Para acompanhar, você precisa ter Node.js instalado em seu computador e uma versão recente do NestJS.

Use as etapas a seguir para criar um aplicativo de blog simples que implemente o padrão de design CQRS.

Criar um Projeto Nest

Crie um novo projeto Nest e gere um publicar recurso para um aplicativo de blog. Você pode fazer isso executando os seguintes comandos em um terminal:

aninhar novo nestjs-cqrs
postagens do módulo nest g
postagens do controlador ninho g
Postos de serviço Nest G

Instalar dependências

Depois de concluir as etapas acima, execute este comando de terminal para instalar o pacote NestJS CQRS:

npm install --save @nestjs/cqrs

Criar um serviço postal

Adicione o seguinte código ao seu posts.service.ts arquivo para definir o Correios aula.

// posts.service.ts
importar { Injetável } de'@nestjs/common';

exportarinterface Publicar {
título: corda;
contente: corda;
}

@Injetável()
exportaraula Correios {
privado postagens somente leitura: Post[] = [];

criar (postagem: Postar): Postar {
esse.postagens.push (postagem);
retornar publicar;
}

encontrarById (id: número): Publicar {
retornaresse.posts.find(publicar => post.id id);
}
}

O Correios define criar e findById métodos para criar uma nova postagem e obter uma postagem existente de seu ID.

Definir comandos e consultas

A próxima etapa é definir as consultas e comandos que são essenciais para o padrão de design CQRS.

No Postagens diretório, crie dois novos arquivos: criarPostCommand.command.ts e getPostQuery.query.ts. O arquivo de comando deve ficar assim:

// createPostCommand.command.ts
exportaraula CreatePostCommand {
construtor(público título somente leitura: corda, público conteúdo somente leitura: corda) {}
}

E o arquivo de definição de consulta, assim:

// getPostQuery.query.ts
exportaraula GetPostQuery {
construtor(público id somente leitura: número) {}
}

Criar manipuladores de comandos e consultas

Depois de definir com sucesso seus comandos e consultas, você precisa criar manipuladores para eles. Um manipulador é uma função que executa um comando ou consulta e retorna o resultado.

Criar uma handlers.ts arquivo em seu publicar diretório e cole o seguinte código nele:

// handlers.ts
importar { CommandHandler, ICommandHandler } de'@nestjs/cqrs';
importar { CreatePostCommand } de'./createPostCommand.command.ts';
importar { Correios } de'./Correios';

@CommandHandler(CreatePostCommand)
exportaraula CreatePostHandler implementos ICommandHandler {
construtor(privado readonly postService: PostService) {}

assíncrono execute (comando: CreatePostCommand) {
const { nome, preço } = comando;
const postar = aguardamesse.postService.create (título, conteúdo);
retornar publicar;
}
}

No mesmo handlers.ts arquivo, você pode modificar as instruções de importação para incluir as abaixo, para permitir o trabalho com consultas. Você pode então implementar o manipulador de consulta como visto no código abaixo:

// manipulador.ts
importar { QueryHandler, IQueryHandler } de'@nestjs/cqrs';
importar { GetPostQuery } de'./getPostQuery.query';
importar { Correios } de'./Correios';

// manipulador de consultas
@QueryHandler(GetProductQuery)
exportaraula GetPostHandler implementos IQueryHandler {
construtor(privado readonly postService: PostService) {}

assíncrono executar (consulta: GetPostQuery) {
const { id } = consulta;
const postar = aguardamesse.postService.findOneById (id);
retornar publicar;
}
}

Manipuladores de registro

A última etapa é registrar os manipuladores de comando e consulta com o módulo NestJS.

// post.module.ts
importar { Módulo } de'@nestjs/common';
importar { CommandHandlers, QueryHandlers } de'manipuladores.ts';
importar { Correios } de'./Correios';

@Módulo({
provedores: [
Correios,
...CommandHandlers,
...QueryHandlers,
],
})
exportaraula Pós-módulo {}

Este código registra o Correios, CommandHandlers, e QueryHandlers no provedores variedade. O uso de um operador de spread (...) é mesclar as matrizes de consulta manipuladores e comando manipuladores no provedores variedade.

Executar comandos e consultas

Os comandos registrados e manipuladores de consulta podem ser usados ​​em controladores. O código a seguir é a implementação de um Postagens controlador que aceitará solicitações HTTP e retornará as respostas necessárias.

// posts.controller.ts
importar { Corpo, controlador, posto } de'@nestjs/common';
importar { ComandoBus } de'@nestjs/cqrs';
importar { CreatePostCommand } de'./createPostCommand.command.ts';

// controlador que implementa o comando
@Controlador('Postagens')
exportaraula PostController {
construtor(privado commandBus somente leitura: CommandBus) {}

@Publicar()
assíncrono criarPost(@Corpo() corpo: { título: corda; contente: corda }) {
const { título, conteúdo } = corpo;
const comando = novo CreatePostCommand (título, conteúdo);
const postar = aguardamesse.commandBus.execute (comando);
retornar publicar;
}
}

No código acima, o CommandBus executa o CreatePostCommand e cria uma nova postagem.

Este código mostra como implementar um controlador que usa uma consulta:

// posts.controller.ts
importar { Controlador, Obter, Param } de'@nestjs/common';
importar { ConsultaBus } de'@nestjs/cqrs';
importar { GetPostQuery } de'./getPostQuery.query';

@Controlador('Postagens')
exportaraula PostController {
construtor(privado queryBus somente leitura: QueryBus) {}

@Pegar(':eu ia')
assíncrono getPost(@Param('eu ia') eu ia: número) {
const consulta = novo GetPostQuery (id);
const postar = aguardamesse.queryBus.execute (consulta);
retornar publicar;
}
}

O queryBus executa GetPostQuery que obtém a postagem com o ID fornecido e a retorna.

Depois de concluir todas as etapas acima, agora você deve ter um aplicativo minimalista e funcional para criar e buscar postagens de blog.

Embora o código aqui use um array para armazenar os posts criados na memória, é mais provável que você use um banco de dados em produção. Você pode usar um banco de dados SQL, ou um Banco de dados NoSQL como MongoDB, pois o NestJS oferece suporte a ambas as opções.

Construindo APIs com o Padrão de Design CQRS

A incorporação do padrão de design CQRS em seu aplicativo NestJS pode ajudar na escalabilidade, desempenho e capacidade de manutenção. O CQRS permite operações mais eficientes e otimizadas, separando as operações de leitura e gravação que um aplicativo realiza.

O pacote @nestjs/cqrs fornece um bloco de construção para implementar o CQRS no NestJS com comandos e manipuladores de consulta. No geral, o CQRS é um padrão poderoso que pode ajudar a criar aplicativos mais eficientes e escaláveis, e você deve avaliar suas opções antes de usá-lo.