Contents

Injectando um serviço Nest.js a partir de um módulo diferente

A injeção de um serviço de um módulo Nest.js diferente envolve algumas etapas para garantir a injeção de dependência e a organização do módulo adequadas. Usando dois módulos de amostra, saiba como funciona o processo de exportação e importação de serviços.

Gerando um projeto Nest.js

Para criar um aplicativo Nest.js, verifique se a interface de linha de comando (CLI) está instalada no sistema. Caso não esteja, execute o seguinte comando para configurar a CLI:

 npm install -g @nestjs/cli

Para criar um novo projeto Nest.js usando a interface de linha de comando (CLI) do Nest.js, execute as seguintes etapas:1. Instale a CLI do Nest.js executando o comando “npm install -g @nestjs/cli” ou “@yarn global add nestjs-cli”. Isso permitirá que você gerencie e interaja com seus projetos Nest.js a partir da linha de comando.2. Execute o comando “nest new " para gerar um novo projeto Nest.js no diretório especificado. A configuração padrão para o projeto recém-criado já está definida e pronta para o desenvolvimento.

 nest new <project-name>

Após a execução do comando fornecido, pode-se substituir ’ ’ por uma denominação de sua própria escolha para estabelecer um novo ambiente de desenvolvimento Nest.js com o título designado.

A configuração atual do seu projeto deve estar em conformidade com a representação ilustrada na representação gráfica fornecida abaixo:

/pt/images/nest-js-project-skeleton.jpg

Para aperfeiçoar as suas capacidades de integração de serviços em módulos distintos, é necessário criar dois módulos separados, nomeadamente o módulo-a e o módulo-b, juntamente com os respectivos ficheiros de serviço e controlador para cada um.

Execute este comando para gerar o módulo-a:

 nest generate module module-a

E execute o comando equivalente para o módulo-b:

 nest generate module module-b

Para criar os arquivos necessários para o módulo-a, execute o seguinte comando:

 nest generate service module-a && nest generate controller module-a

E execute o comando equivalente para o módulo-b:

 nest generate service module-b && nest generate controller module-b

A estrutura do seu atual diretório de projeto deve assemelhar-se a um arranjo hierárquico, compreendendo dois subdirectórios primários - nomeadamente “src/module-a” e “src/module-b”.

/pt/images/nest-js-project-skeleton-with-modules.jpg

Exportando um Serviço do Módulo A

Para extrair o componente Service-A do Módulo-A e torná-lo acessível para uso em outro lugar dentro da aplicação, é preciso incluí-lo entre os itens listados em “exports” no arquivo de módulo do Módulo-A (ou seja, Module-A.module.ts).Normalmente, ao utilizar a interface de linha de comando (CLI) do Nest.js, não há uma matriz “exports” predefinida fornecida com o decorador “@Module”; portanto, o arquivo de módulo resultante exibiria uma estrutura semelhante à seguinte:

 // module-a.module.ts
import { Module } from '@nestjs/common';
import { ModuleAService } from './module-a.service';
import { ModuleAController } from './module-a.controller';

@Module({
  providers: [ModuleAService],
  controllers: [ModuleAController],
})

export class ModuleAModule {}

Para permitir a acessibilidade de module-a.service.ts por outros módulos que importam module-a , uma matrizexports deve ser criada dentro do decorador @Module e ModuleAService deve ser adicionada a ela.

Assim:

 import { Module } from '@nestjs/common';
import { ModuleAService } from './module-a.service';
import { ModuleAController } from './module-a.controller';

@Module({
  providers: [ModuleAService],
  controllers: [ModuleAController],
  exports: [ModuleAService],
})

export class ModuleAModule {}

Para realizar testes no serviço module-a , você pode criar um novo arquivo chamado module-a.service.ts no mesmo diretório que os outros arquivos deste projeto. Esse arquivo conterá uma função simples que utiliza a classe ModuleAService e demonstra sua funcionalidade.

 import { Injectable } from '@nestjs/common';

@Injectable()
export class ModuleAService {
  getHello(): string {
    return 'Hello from Module A!';
  }
}

O texto apresentado parece ter sido escrito numa linguagem coloquial e carece de refinamento. Eis uma tentativa de o reformular com mais elegância: Para garantir a funcionalidade correcta deste serviço, recomendamos que se chame a função acima referida no módulo especificado (módulo-b) após a injeção do serviço-a. Ao fazê-lo, é possível verificar a integração bem sucedida do referido serviço.

Importando um serviço para o módulo B

Para que um módulo seja importado para outro, ele deve estar listado entre as importações do decorador @Module do módulo recetor. Assim, no caso em que o módulo-a está a ser importado pelo módulo-b, tem de ser adicionado à matriz imports dentro do decorador @Module do módulo-b.

Para utilizar os módulos importados em um projeto Nest.js, é preciso criar manualmente uma matriz imports dentro do arquivo de módulo do aplicativo. A interface de linha de comando (CLI) do Nest.js não fornece essa funcionalidade por padrão, necessitando de intervenção manual para sua inclusão.

De facto, o processo envolve a importação do módulo principal do ficheiro “module-a.module.ts” para o módulo recetor localizado em “module-b.module.ts”. Depois disso, é criada uma instrução de importação no código do módulo recetor e adicionada a uma matriz específica, após o que o módulo pretendido, nomeadamente “ModuleAModule”, é anexado a essa mesma matriz.

 // module-b.module.ts
import { Module } from '@nestjs/common';
import { ModuleBController } from './module-b.controller';
import { ModuleBService } from './module-b.service';
import { ModuleAModule } from '../module-a/module-a.module';

@Module({
  imports: [ModuleAModule],
  controllers: [ModuleBController],
  providers: [ModuleBService],
})

export class ModuleBModule {}

De facto, passemos ao passo seguinte, abrindo o ficheiro module-b.service.ts no nosso projeto.Precisaremos importar tanto o decorador @Inject quanto a classe ModuleAService de duas fontes diferentes dentro da base de código do nosso aplicativo. Especificamente, devemos obter esses itens do pacote @nestjs/common para o primeiro e de um local separado em outra parte da estrutura do nosso projeto para o segundo.

 import { Injectable, Inject } from '@nestjs/common';
import { ModuleAService } from '../module-a/module-a.service';

O decorador Inject designa seu parâmetro como um destinatário pretendido da injeção de dependência, significando que ele é um componente crucial na funcionalidade do sistema e deve ser fornecido com os recursos ou serviços necessários para funcionar de forma eficaz.

De facto, no contexto da classe ModuleBService , é necessário incorporar o excerto de código supramencionado num momento apropriado.

 @Inject(ModuleAService)
  private readonly moduleAService: ModuleAService;

A concessão de acesso aos métodos do ModuleAService é facilitada pelo bloco de código fornecido, permitindo assim a utilização no ModuleBService.

É possível validar a funcionalidade do serviço, o método “getHello” do ModuleAService, através de testes.

 // module-b.service.ts
import { Injectable, Inject } from '@nestjs/common';
import { ModuleAService } from 'src/module-a/module-a.service';

@Injectable()
export class ModuleBService {
  @Inject(ModuleAService)
  private readonly moduleAService: ModuleAService;

  getHello(): string {
    return this.moduleAService.getHello();
  }
}

De facto, vamos agora modificar o conteúdo do ficheiro module-b.controller.ts, substituindo o código existente pelo excerto de código fornecido.

 // module-b.controller.ts
import { Controller, Get } from '@nestjs/common';
import { ModuleBService } from './module-b.service';

@Controller('module-b')
export class ModuleBController {
  constructor(private readonly moduleBService: ModuleBService) {}

  @Get('/hello')
  getHello(): string {
    return this.moduleBService.getHello();
  }
}

O trecho de código fornecido estabelece um mecanismo de tratamento de pedidos HTTP GET para a função “getHello”, que é responsável por recuperar e processar dados relacionados com pedidos ou entradas específicas do utilizador.

Por fim, execute um pedido GET utilizando cURL para http://localhost:3000/module-b/hello . O comando apresentará “Hello from Module A!” na consola.

A injeção bem sucedida de um serviço noutro módulo é particularmente benéfica quando se desenvolvem APIs no Nest.js, que envolvem frequentemente vários módulos interdependentes que requerem acesso às funcionalidades uns dos outros.

Benefícios da injeção entre módulos

A incorporação de um serviço por meio de invocação direta pode parecer uma opção conveniente inicialmente; no entanto, ela geralmente resulta em uma arquitetura mais complexa, difícil de manter e de escopo limitado ao longo do tempo.

De facto, a implementação da injeção de módulos cruzados promove um sistema mais coeso e adaptável, aumentando a modularidade e facilitando a reutilização de componentes. Além disso, esta abordagem consolida as dependências, aumenta a viabilidade dos testes e permite um design arquitetonicamente sólido, com acoplamento flexível, capaz de acomodar o crescimento.