NestJS 应用生命周期
不同阶段
- 创建 nestjs 实例阶段:NestJS 创建应用实例
- 初始化阶段:创建依赖注入容器、处理模块依赖关系、实例化提供者、控制器等
- 启动阶段:执行onModuleInit钩子、执行onApplicationBootstrap钩子、开始监听网络请求
- 运行阶段:处理传入请求、执行中间件、守卫、拦截器等
shell
# 简单
客户端请求 --> 中间件 --> 守卫 --> 管道 --> 拦截器(前置) --> 控制器方法执行 --> 拦截器(后置) --> 异常过滤器 --> 返回响应
# 详细
请求到达 → 全局中间件 → 模块/路由中间件
→ 全局守卫 → 控制器守卫 → 方法守卫
→ 全局拦截器(前置) → 控制器拦截器(前置) → 方法拦截器(前置)
→ 全局管道 → 控制器管道 → 方法管道 → 参数管道
→ 控制器处理方法(业务逻辑)
→ 方法拦截器(后置) → 控制器拦截器(后置) → 全局拦截器(后置)
→ 异常过滤器(捕获所有阶段的异常)
→ 响应返回
# 注意
异常可在任意阶段抛出,抛出后直接进入异常过滤器处理,终止后续流程。- 终止阶段:执行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}`);
// 在这里执行最终的清理逻辑
}
}