学习了 nest 第一阶段的总结,主要围绕 Module Controller Provider Aop 等基础功能。
Module
module是 nest 架构的基本组成单元 , 从appModule开始构建依赖图数据结构import & export可以是的模块之间的provider可以相互引用 。注意循环依赖。@Global()标注全局模块,不需要引入也可以直接使用dynamic module通过函数返回不固定的module达到定制化的效果lazyLoad module懒加载模块,在程序运行中,指定加载时机moduleRef提供了一个不需要注入的访问provider的方法 , 仅仅在当前modulecontext下
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,ExistingProviderFactoryProvider通过函数或者异步函数来返回 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: 用于加载模块