No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Global Module

8/17
Recursos

Al desarrollar una aplicación con NestJS, existen necesidades de importar módulos cruzados o de importar un mismo servicio en varios módulos. Lo anterior, hace que la cantidad de imports en cada módulo crezca y se vuelva complicado de escalar.

Cómo usar el módulo global

NestJS otorga la posibilidad de crear módulos globales que se importarán automáticamente en todos los otros módulos de la aplicación, sin necesidad de importarlos explícitamente.

import { Module, Global } from '@nestjs/common';

@Global()
@Module({
  // ...
})
export class MyCustomModule {}

Todos los servicios que importes en este módulo, estarán disponibles para su utilización en cualquier otro módulo.

Es importante no abusar de esta característica y no tener más de un módulo global para controlar las importaciones. Pueden ocurrir errores de dependencias circulares que suceden cuando el Módulo A importa al Módulo B y este a su vez importa al Módulo A. El decorador @Global() te ayudará a resolver estos problemas.

Cuadro de código para uso de global module

// src/database/database.module.ts

import { Module, Global } from '@nestjs/common';

const API_KEY = '12345634';
const API_KEY_PROD = 'PROD1212121SA';

@Global()
@Module({
  providers: [
    {
      provide: 'API_KEY',
      useValue: process.env.NODE_ENV === 'prod' ? API_KEY_PROD : API_KEY,
    },
  ],
  exports: ['API_KEY'],
})
export class DatabaseModule {}
// src/app.module.ts
...
import { DatabaseModule } from './database/database.module';

@Module({
  imports: [
    HttpModule,
    UsersModule,
    ProductsModule,
    DatabaseModule // 👈 Use DatabaseModule like global Module
   ], 
  ...
})
export class AppModule {}
// src/users/services/users.service.ts

import { Injectable, NotFoundException, Inject } from '@nestjs/common';
..

@Injectable()
export class UsersService {
  constructor(
    private productsService: ProductsService,
    @Inject('API_KEY') private apiKey: string, // 👈 Inject API_KEY
  ) {}

}

Contribución creada por: Kevin Fiorentino.

Aportes 8

Preguntas 7

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

Apuntes

Un modulo global será instanciado en todos los demás módulos si que nosotros tengamos que hacerlo explícitamente.

Creando un modulo global

  • Para ello creamos un modulo
    nest g mo database
  • Al modulo le agregaremos el decorador global
... 
@Global() // Aqui
@Module({})
export class ProductsModule {}
  • Ahora podemos agregar todos los controladores, modulos y providers que necesitemos
import { Module, Global } from '@nestjs/common';

const API_KEY = '12345634';
const API_KEY_PROD = 'PROD1212121SA';

@Global()
@Module({
  providers: [
    {
      provide: 'API_KEY',
      useValue: process.env.NODE_ENV === 'prod' ? API_KEY_PROD : API_KEY,
    },
  ],
  exports: ['API_KEY'],
})
export class DatabaseModule {}
  • y agregaremos el modulo global al app.module.ts
// src/app.module.ts
...
import { DatabaseModule } from './database/database.module';

@Module({
  imports: [
    ...
    DatabaseModule // 👈 Use DatabaseModule like global Module
   ], 
  ...
})
export class AppModule {}

Listo, ahora podremos usar todos los controladores, modulos y providers que fueron declarados en el modulo global sin tener que instanciar el modulo DatabaseModule en los modulos que se requieran

// src/users/services/users.service.ts

import { Injectable, NotFoundException, Inject } from '@nestjs/common';
..

@Injectable()
export class UsersService {
  constructor(
    private productsService: ProductsService,
    @Inject('API_KEY') private apiKey: string, // 👈 Inject API_KEY
  ) {}

}

Esto me recuerda mucho a Redux🤔

Global Modulo crea una instancia para todos los modulos, no es necesario exportar ni importar

creando un modulo para conexión a Base de datos, sera un global module

Hola primero gracias por lo videos =D, segundo a pesar que si tengo conocimiento en dependencia circulares en DB no sé me hace fácil entender la solución que dan en este curso, me gustaría si fuera posible que nos diera una respuesta más detallada. Me explico entiendo que siempre tenemos que evitar las tranferencia circulares o inyecciones circulares esto igual ocurre a nivel de base de datos. En nivel de base de datos siempre se busca generar entidades que no tengan estas dependencias, por lo cual la solucion es simple, nunca crear una dependencia circular. Pero en el caso mostrado en los servicio no entiendo cual es el efecto de tener esta inyeccion circular, y si fuera el mismo problema que existe en la DB (¿debo considerar que este problema viene de las dependencia circulares de la BD o son distintas?), no entiendo como haciendo un modulo global soluciona el problema ya que los servicios van a funcionar de las misma manera. Gracias.

Estoy utilizando enums, para evitar los magic strings como “API_KEY” y asi asegurarme que estoy mandando el string correcto

export const API = {
  KEY_DEV: 'API_KEY',
  KEY_PROD: 'API_KEY_PROD',
} as const;

export const FACTORY = {
  TASKS: 'TASKS',
} as const;

export const ENV = {
  PROD: 'prod',
};

muy buena clase. tiene buen dominio.

👏