nest总结

282 阅读3分钟

中间件:

  • 目的:整个模块中应用,用于对请求进行处理
  • 装饰器:@Injectable()
  • 实现: NestMiddleware 接口
  • 应用:模块类的 configure(consumer: MiddlewareConsumer) 方法 consumer.apply(LoggerMiddleware).forRoutes('cats');
  • 关键注意点:注意next()
  • 返回:结束或者响应请求或者next()
  • 应用场景:对请求前的参数进行加解密,给请求request体添加后台所需的字段,例如验签成功与否标志字段

异常过滤器

  • 目的:对整个过程中异常情况进行捕捉处理
  • 装饰器:@Catch(可选:捕捉错误类型;没有则默认全部类型)
  • 实现:ExceptionFilter接口 + catch(exception: HttpException, host: ArgumentsHost) 方法
  • 应用:@UseFilters(过滤器实例或者类名) 尽可能使用类而不是实例。由于 Nest 可以轻松地在整个模块中重复使用同一类的实例,因此可以减少内存使用。 三种绑定-》方法范围的、控制器范围的和全局范围
  • 返回:response.设置

管道:

  • 目的:对请求中的输入输出数据进行处理 格式转换,类型匹配验证啥的
  • 装饰器:@Injectable()
  • 实现 :PipeTransform 接口 + transform(value 是当前处理的参数,metadata 是其元数据)方法
  • 应用:@UsePipes() 三种绑定-》方法范围的、控制器范围的和全局范围 外加参数范围(当验证逻辑仅涉及一个指定的参数时) 例如findOne(@Param('id', new ParseIntPipe()) id) 其中 ParseIntPipe()返回值赋给id变量
  • 返回:值

守卫:

  • 目的:对用户身份进行验证
  • 装饰器:@Injectable()
  • 实现: CanActivate 接口+canActivate(context: ExecutionContext)函数 ExecutionContext.getClass()getHandler()
  • 关键点: 守卫在每个中间件之后执行,但在任何拦截器或管道之前执行 基于角色:借助Reflector 帮助类与反射器@SetMetadata()----this.reflector.get<string[]>('roles', context.getHandler());
  • 返回:boolean
  • 应用场景:对客户端请求控制器中的路由地址的权限进行判断,没有权限则返回false,有权限返回true 例如:1.判断验签成功与否标志,成功true,失败false 2.判断用户是否需要登录,登录态缓存存取,用于需要用户登录才能访问的接口 3.判断环境(开发、测试、生产),用于不同场景下展示不同的接口
  • tips:可通过设置skipGuard装饰器,在对应guard中对该类装饰器进行处理,若识别到接口使用了装饰器则返回true,不进行守卫验证

拦截器:

  • 目的:在函数执行之前/之后绑定额外的逻辑、面向切面编程(AOP)技术
  • 装饰器
  • 实现:NestInterceptor 接口 intercept(context: ExecutionContext, next: CallHandler): Observable方法、
  • 应用:@UseInterceptors() 三种绑定-》方法范围的、控制器范围的和全局范围
  • 注意点:next.handle()返回一个对路由处理函数处理结果封装后的Observable对象 即: 如果在拦截器中调用了next.handle()方法就会执行对应的路由处理函数,如果不调用的话就不会执行

总结

  1. 在使用@Catch @Injectable这些装饰器的时候,对应需要实现某个接口的意义在于:强制实现规定的函数,例如catch函数。 也可以不实现接口,只实现对应的函数,实现接口的方式是为了规范性和可读性

  2. 类似Catch装饰器的作用:将装饰器修饰的函数或者Class类注册到nest内核的记录库中,内核根据关键字或者参数(例如catch的httpeException参数) 生成对应的具有优先级排序的一个个表,在请求发送过来的时候,通过关键字(例如产生了错误,错误类型为httpeException)命中表,在表里命中对应函数(例如:.catch函数)并执行