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 7

Preguntas 5

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad?

o inicia sesi贸n.

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

Estoy utilizando enums, para evitar los magic strings como 鈥淎PI_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.

馃憦