一篇文章掌握 NestJS 所有的生命周期以及执行时机
前言
NestJS 是一个用于构建高效、可扩展的 Node.js 服务器端应用程序的框架,它使用 TypeScript 作为开发语言,也支持原生的 JavaScript。在 NestJS 中,生命周期事件是一个重要的概念。在我们构建和管理应用程序时,有时需要在特定的阶段执行一些操作,例如在创建实例,添加或删除模块,突然终止程序时,对这些事件加以利用,可以使我们的应用程序更强大、灵活。
在本文中,我将介绍 NestJS 的生命周期,如何使用生命周期,并通过给出详细的例子加深理解。
NestJS 有哪些生命周期
NestJS 的生命周期钩子允许你在特定时刻执行特定代码,例如在模块初始化或关闭应用时。在 NestJS 中,每个模块和提供者(providers)都有自己的生命周期。
其中可能包括如下几种事件:
应用启动阶段
-
onModuleInit()
当你的模块通过
modules
数组注册在 Nest 应用程序中时,内部所有的 providers(包括你的服务、守卫、拦截器等)初始化后会调用此方法。这是生命周期的第一个环节。 -
onApplicationBootstrap()
此阶段表示所有的东西(模块、providers 以及路由加载器等)都已经被完全初始化,Nest 应用实例已准备好处理请求了。因此,这是 bootstraping 过程的最后一个步骤,它也表示 HTTP 服务器已完成启动。
应用关闭阶段
-
onModuleDestroy()
当正在销毁 module 时(通常是你主动调用了
app.close()
,或者 Nest 进程被 OS 发来的 SIGINT、SIGTERM 等信号中断时),这个方法会被调用。 -
BeforeApplicationShutdown
任何实现了
BeforeApplicationShutdown
的方法在应用关闭前都会被调用。如果是因为应用收到系统信号,并准备进行关闭处理时(例如SIGTERM
或SIGINT
),对应的信号名称将传给beforeApplicationShutdown(signal?: string)
这个方法。 -
onApplicationShutdown()
此阶段是关闭过程的最后一个步骤。它给 Nest 大环境一些时间做最后的清理行为(例如日志写入等)。当这个方法执行完后,进程就会正式退出。
📌 如果生命周期方法返回一个
Promise
,Nest 将等待这个Promise
完成(或者解决)之后再继续生命周期。
生命周期使用方式
OnModuleInit VS OnModuleDestroy
shellimport { Injectable, OnModuleInit, OnModuleDestroy } from '@nestjs/common'; @Injectable() export class LoggingService implements OnModuleInit, OnModuleDestroy { onModuleInit() { console.log(`The LoggingService has been initialized.`); } onModuleDestroy() { console.log(`The LoggingService is being destroyed.`); } }
当模块初始化时,我们在控制台打印出 The LoggingService has been initialized
;当模块被销毁时,则打印 The LoggingService is being destroyed.
。
OnApplicationBootstrap VS BeforeApplicationShutdown
shellimport { Injectable, BeforeApplicationShutdown, OnApplicationBootstrap } from '@nestjs/common'; @Injectable() export class LoggingService implements BeforeApplicationShutdown, OnApplicationBootstrap { onApplicationBootstrap() { console.log(`Application has fully started`); } beforeApplicationShutdown(signal: string) { console.log(`Received shutdown signal: ${signal}`); } }
onApplicationShutdown
onApplicationShutdown
方法,它将在应用进行关闭之前被触发。
shellimport { Injectable, OnApplicationShutdown } from '@nestjs/common'; @Injectable() export class AppService implements OnApplicationShutdown { onApplicationShutdown(signal: string) { console.log('AppService is shutting down due to: ', signal); } }
其中,signal
参数可以获取导致应用关闭的信号类型,如 'SIGINT'
、'SIGTERM'
或 **'SIGKILL'
**等。
这种方式在你需要在应用关闭前进行一些清理工作,如关闭数据库连接、结束正在执行的任务或记录日志等方面特别有用。
总结
理解 NestJS 的生命周期事件以及如何处理这些事件,可以帮助我们在构建大型复杂应用程序时保持代码的清晰性和组织性,希望本文能够对大家有所帮助。