Appearance
生命周期和基本概念
⭐⭐⭐⭐⭐
本页对 Nest 的生命周期和基本概念做一些说明。
基本概念
控制器
控制器负责处理传入的请求和向客户端返回响应。
提供者
Providers 是 Nest 的一个基本概念。Nest 实现了 IoC 容器,会从入口模块开始扫描,分析 Module 之间的引用关系,对象之间的依赖关系,自动把 provider 注入到目标对象。
一般情况下,provider 是通过 @Injectable() 声明,然后在 @Module 的 providers 数组里注册的 class。
Provider 是服务提供者,默认都是 service 后缀,所以我们的 provider 就是为了给我们要控制的方法 controller 来提供服务的,由于 Nest 是依靠依赖注入来实现在模块中使用服务,我们使用 @Injectable() 来标明它是可以被注入的。
守卫
守卫是一个使用 @Injectable() 装饰器的类。 守卫应该实现 CanActivate 接口,它们根据运行时出现的某些条件(例如权限,角色,访问控制列表等)来确定给定的请求是否由路由处理程序处理。
拦截器
拦截器是使用 @Injectable() 装饰器注解的类。拦截器应该实现 NestInterceptor 接口。
管道
管道是具有 @Injectable() 装饰器的类。管道应实现 PipeTransform 接口
管道有两个类型:
转换:管道将输入数据转换为所需的数据输出
验证:对输入数据进行验证,如果验证成功继续传递, 验证失败则抛出异常
异常过滤器
内置的异常层负责处理整个应用程序中的所有抛出的异常。当捕获到未处理的异常时,最终用户将收到友好的响应。
参考官方文档:作用域
Nest的生命周期
- 收到请求
- 全局绑定的中间件
- 模块绑定的中间件
- 全局守卫
- 控制层守卫
- 路由守卫
- 全局拦截器(控制器之前)
- 控制器层拦截器 (控制器之前)
- 路由拦截器 (控制器之前)
- 全局管道
- 控制器管道
- 路由管道
- 路由参数管道
- 控制器(方法处理器)
- 服务(如果有)
- 路由拦截器(请求之后)
- 控制器拦截器 (请求之后)
- 全局拦截器 (请求之后)
- 异常过滤器 (路由,之后是控制器,之后是全局)
- 服务器响应
参考官方文档:请求生命周期
生命周期事件
| 生命周期钩子方法 | 生命周期时间触发钩子方法调用 |
|---|---|
| OnModuleInit() | 初始化主模块依赖处理后调用一次 |
| OnApplicationBootstrap() | 在应用程序完全启动并监听连接后调用一次 |
| OnModuleDestroy() | 收到终止信号(例如SIGTERM)后调用 |
| beforeApplicationShutdown() | 在 onModuleDestroy() 完成(Promise 被 resolved 或者 rejected);一旦完成,将关闭所有连接(调用app.close() 方法) |
| OnApplicationShutdown() | 连接关闭处理时调用(app.close()) |
使用方式:
ts
import { Injectable, OnModuleInit } from '@nestjs/common'
@Injectable()
export class UsersService implements OnModuleInit {
onModuleInit() {
console.log(`The module has been initialized.`)
}
}如果应用程序接收到一个终止信号,它将会依次调用注册的 onModuleDestroy(), beforeApplicationShutdown() 和 onApplicationShutdown() 方法,将响应信号作为第一个参数。如果一个注册函数等待异步调用(作为promise),那么在 promise 被解析或拒绝之前,它不会关闭 Nest 应用程序。
ts
@Injectable()
class UsersService implements OnApplicationShutdown {
onApplicationShutdown(signal: string) {
console.log(signal)
}
}更多信息参考官方文档:生命周期事件
