Post

Guía Completa de LifeCycle Events en NestJS

Guía Completa de LifeCycle Events en NestJS

Desktop View

Introducción

En Nest.js, gestionar eficazmente el LifeCycle events (ciclo de vida) de una aplicación es fundamental para garantizar su robustez y persistencia. Este framework proporciona hooks o “lifecycle hooks” (ganchos del ciclo de vida) que nos permiten, como desarrolladores, interactuar con la aplicación en fases críticas, desde la inicialización, pasando por la ejecución, hasta la finalización. Esta guía detallada te llevará a través de cada evento del ciclo de vida, explicando su importancia, usos prácticos y proporcionando ejemplos de código para ilustrar cómo se pueden implementar en tus proyectos.

Resumen de los eventos del ciclo de vida.

Nest.js organiza el ciclo de vida de la aplicación en tres fases: inicialización, ejecución y finalización. Cada fase tiene eventos específicos del ciclo de vida que permiten a los desarrolladores ejecutar lógica personalizada.

Eventos clave del ciclo de vida

Entender cada evento en detalle te ayudará a aprovechar al máximo el potencial de Nest.js para gestionar el comportamiento de la aplicación de manera fluida.

1. onModuleInit()

Propósito: onModuleInit se ejecuta una vez que Nest ha instanciado un módulo y resuelto sus dependencias, pero antes de que esté completamente operativo y disponible. Este evento es crucial para configurar cualquier configuración o datos iniciales que el módulo necesite.

Uso: Ideal para inicializar servicios de datos, configurar conexiones a bases de datos o precargar información necesaria que tu módulo necesitará a lo largo de su vida útil.

Ejemplo:

1
2
3
4
5
6
7
8
9
@Injectable()
export class DataService implements OnModuleInit {
  constructor(private readonly configService: ConfigService) {}

  onModuleInit() {
    const dbHost = this.configService.get("DATABASE_HOST");
    console.log(`Conectando a la base de datos en ${dbHost}`);
  }
}

2. onApplicationBootstrap()

Propósito: Este hook se ejecuta después de que todos los módulos han sido inicializados y justo antes de que la aplicación comience a escuchar conexiones. Es el paso final antes de que la aplicación esté completamente operativa.

Uso: Utilízalo para acciones que deban ocurrir justo antes de que el servidor comience a aceptar solicitudes, como configurar trabajos programados, finalizar configuraciones o enviar notificaciones a los administradores de que la aplicación está activa.

Ejemplo:

1
2
3
4
5
6
7
8
9
10
11
@Injectable()
export class SchedulerService implements OnApplicationBootstrap {
  onApplicationBootstrap() {
    console.log("Iniciando trabajos programados...");
    this.startJobs();
  }

  startJobs() {
    // Lógica para iniciar trabajos programados
  }
}

3. onModuleDestroy()

Propósito: Se ejecuta cuando la aplicación está a punto de cerrarse. onModuleDestroy es esencial para operaciones de limpieza.

Uso: Este evento es crucial para liberar los recursos que tu módulo posee, como conexiones a bases de datos, manejadores de archivos o conexiones de red, para evitar fugas de memoria y otros problemas durante el cierre.

Ejemplo:

1
2
3
4
5
6
7
8
9
10
11
@Injectable()
export class ResourceService implements OnModuleDestroy {
  onModuleDestroy() {
    console.log("Liberando recursos...");
    this.releaseAllResources();
  }

  releaseAllResources() {
    // Lógica para liberar recursos de manera limpia
  }
}

4. beforeApplicationShutdown() y onApplicationShutdown()

Propósito: Estos hooks gestionan los momentos finales antes de que la aplicación se cierre completamente. beforeApplicationShutdown es tu última oportunidad para realizar operaciones asíncronas, mientras que onApplicationShutdown se llama justo antes de que el proceso de la aplicación termine.

Uso: beforeApplicationShutdown se puede usar para tareas que deben completarse incluso durante el cierre, como guardar los últimos registros en una base de datos o notificar a sistemas externos sobre el apagado. onApplicationShutdown puede registrar el motivo del cierre o realizar una limpieza final.

Ejemplo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Injectable()
class ShutdownService
  implements BeforeApplicationShutdown, OnApplicationShutdown
{
  beforeApplicationShutdown(signal: string) {
    console.log(
      `Recibida la señal ${signal}, realizando tareas previas al cierre.`
    );
  }

  onApplicationShutdown(signal: string) {
    console.log(`Cerrando debido a la señal ${signal}.`);
  }
}

Conclusión

Los eventos del ciclo de vida en Nest.js están diseñados para dar a los desarrolladores control sobre el comportamiento de la aplicación en diferentes etapas de su existencia. Al utilizar estos ganchos de manera efectiva, puedes garantizar que tu aplicación maneje los procesos de inicialización y cierre de manera fluida, mantenga un buen rendimiento y gestione los recursos de manera eficiente. Estos conocimientos te deberían capacitar para construir aplicaciones más robustas y confiables utilizando Nest.js.

This post is licensed under CC BY 4.0 by the author.