学习了 nest 第一阶段的总结,主要围绕 Module Controller Provider Aop 等基础功能。
Module
module
是 nest 架构的基本组成单元 , 从appModule
开始构建依赖图
数据结构import & export
可以是的模块之间的provider
可以相互引用 。注意循环依赖。@Global()
标注全局模块,不需要引入也可以直接使用dynamic module
通过函数返回不固定的module
达到定制化的效果lazyLoad module
懒加载模块,在程序运行中,指定加载时机moduleRef
提供了一个不需要注入的访问provider
的方法 , 仅仅在当前module
context
下
Controller
路由
通过装饰器来标注接收请求的url
,method
。 注意不要重复装饰器
nest 提供了很多装饰器,需要全部掌握输入
:@Request @Query @Param @Body
输出
:@Response @Header @HttpCode @Redirect
自定义
:@Cookies @User
等,需要创建
request & response
: 很关键的对象,都继承于Stream
都继承于EventEmitter
添加切片
: 可以给指定的路由添加 4 个 Aop 切片
Provider
IOC 容器
所有的 provider 需要通过@Injectable()
标注,进而被 IOC 容器收集管理service
最常见的场景,作为一个业务操作集合Custom Provider
自定义 provider 有 4 种ClassProvider
,ValueProvider
,FactoryProvider
,ExistingProvider
FactoryProvider
通过函数或者异步函数来返回 provider 对象,提供了极大的可编程性。Provider Token
用来标记全局唯一provider
,可以通过注入获取,或者通过moduleRef
获取全局单例
provider 默认是全局单例。可以通过scope
设置 request 级别单例,或者每次都是新实例 ;会影响性能,谨慎使用
Aop
Exception Filters
: 用于拦截异常后更友好的返回数据。- 用
@Catch()
标注,实现ExceptionFilter
接口,使用@UseFilters()
添加 - 应用场景: 错误码统一翻译
- 用
Pipe
: 用于校验或者加工 controller 之前的参数。- 用
@Injectable()
标注,实现PipeTransform
接口,使用@UsePipes()
添加 - 应用场景:接口入参校验
- 用
Guards
: 一般用于校验cookie
,header
等来判断身份- 用
@Injectable()
标注,实现CanActivate
接口,使用@UseGuards()
添加 - 应用场景:登录态校验
- 用
Interceptors
: 包含前置逻辑,后置逻辑 用于前后拦截,做必要业务。- 用
@Injectable()
标注,实现NestInterceptor
接口,使用@UseGuards()
添加 - 应用场景:tracer , 日志,数据包装 等。
- 用
执行顺序如下:
sequenceDiagram
participant Request
participant Guard
participant Interceptors
participant Pipes
participant Handlers
participant Filters
participant Response
activate Request
Request ->> Guard: 最先进入 guard
Guard ->> Filters: 有 Exception 进入 filters
Filters ->> Response: 结束
Guard ->> Interceptors: 没有 exception 进入 interceptor 前置逻辑
Interceptors ->> Pipes: 再进入 Pipes 校验
Pipes ->> Filters: 有 Exception 进入 filters
Filters ->> Response: 结束
Pipes ->> Handlers : 没有 exception 进入 controller handler 执行方法
Handlers ->> Filters: 有 Exception 进入 filters
Filters ->> Response: 结束
Handlers ->> Interceptors : 没有 exception 进入 interceptor 后置逻辑
Interceptors ->> Response: 结束
ExecutionContext
: 执行上下文,获取当前执行环境,区分 http websocket microservice
Nest 内置的特殊 class
通过注入 nest 内置的 class 来处理特定场景的功能
Reflector
: 用于获取自定义装饰器内容ModuleRef
: 用于获取 providerLazyModuleLoader
: 用于加载模块