Skip to content

NestJS 应用生命周期

不同阶段

  1. 创建 nestjs 实例阶段:NestJS 创建应用实例
  2. 初始化阶段:创建依赖注入容器、处理模块依赖关系、实例化提供者、控制器等
  3. 启动阶段:执行onModuleInit钩子、执行onApplicationBootstrap钩子、开始监听网络请求
  4. 运行阶段:处理传入请求、执行中间件、守卫、拦截器等
shell
# 简单
客户端请求 --> 中间件 --> 守卫 --> 管道 --> 拦截器(前置) --> 控制器方法执行 --> 拦截器(后置) --> 异常过滤器 --> 返回响应

# 详细
请求到达 全局中间件 模块/路由中间件
 全局守卫 控制器守卫 方法守卫
 全局拦截器(前置) 控制器拦截器(前置) 方法拦截器(前置)
 全局管道 控制器管道 方法管道 参数管道
 控制器处理方法(业务逻辑)
 方法拦截器(后置) 控制器拦截器(后置) 全局拦截器(后置)
 异常过滤器(捕获所有阶段的异常)
 响应返回

# 注意
异常可在任意阶段抛出,抛出后直接进入异常过滤器处理,终止后续流程。
  1. 终止阶段:执行beforeApplicationShutdown钩子、onApplicationShutdown钩子、释放资源,关闭连接

应用生命周期钩子函数

在 app.service.ts 中实现 NestJS 提供的生命周期钩子函数

ts
import {
  Injectable,
  OnModuleInit,
  OnApplicationBootstrap,
  OnModuleDestroy,
  BeforeApplicationShutdown,
  OnApplicationShutdown,
} from '@nestjs/common';

@Injectable()
export class AppService
  implements
    OnModuleInit,
    OnApplicationBootstrap,
    OnModuleDestroy,
    BeforeApplicationShutdown,
    OnApplicationShutdown
{
  getHello(): any {
    return {
      data: {
        message: 'Hello World',
      },
    };
  }
  onModuleInit() {
    console.log('Module initialized');
    // 在这里执行模块初始化逻辑
  }
  onApplicationBootstrap() {
    console.log('Application bootstrapped');
    // 在这里执行应用启动后的逻辑
  }
  onModuleDestroy() {
    console.log('Module destroyed');
    // 在这里执行模块销毁前的清理逻辑
  }
  beforeApplicationShutdown(signal: string) {
    console.log(`Received shutdown signal: ${signal}`);
    // 在这里执行应用关闭前的逻辑
  }
  onApplicationShutdown(signal: string) {
    console.log(`Application shutting down with signal: ${signal}`);
    // 在这里执行最终的清理逻辑
  }
}