Nest通用工具函数执行顺序

本文介绍如何利用请求流程去记忆这些通用函数的执行顺序,解决不知道时候用通用函数的问题

通用工具函数执行流程

通用工具函数这里包括Middleware中间件、Exception filters异常过滤器、Pipes管道、Guards守卫、Interceptors拦截器

执行流程为中间件→守卫→拦截器→管道→拦截器→异常管理器

中间件

cors中间件为例,这是用于处理跨域的一个函数,代码如下:

ts 复制代码
consumer.apply(cors()).forRoutes(CatsController); // 文档代码

这是第一层关卡,如果存在跨域状况,那么后续的就直接不存在请求流程,所以中间件处在执行顺序的第一位

守卫

以用于划分权限路由守卫为例,如果不具备当前控制器所需要的权限,则无权执行路由,代码如下:

ts 复制代码
@@filename(cats.controller)
@Post()
@Roles(['admin'])
async create(@Body() createCatDto: CreateCatDto) {
  this.catsService.create(createCatDto);
}

也就是即使不存在跨域 问题,如果用户不具备某个权限,也无法执行请求流程,所以守卫排在第二位

拦截器

拦截器是比较特殊的,可用于在方法执行之前/之后绑定额外的逻辑,这一步已经处于请求执行过程 以文档中的代码为例:

ts 复制代码
@@filename(logging.interceptor)
import { Injectable, NestInterceptor, ExecutionContext, CallHandler } from '@nestjs/common';
import { Observable } from 'rxjs';
import { tap } from 'rxjs/operators';

@Injectable()
export class LoggingInterceptor implements NestInterceptor {
  intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
    console.log('Before...');

    const now = Date.now();
    return next
      .handle()
      .pipe(
        tap(() => console.log(`After... ${Date.now() - now}ms`)),
      );
  }
}

在执行路由处理程序之前,会输出Before...,而在执行完后,将输出After... 1ms,这是通过rxjs操作流实现的,可见在请求之前和请求之后都可执行拦截器的逻辑

所以过了守卫之后,会遇到拦截器,排在执行顺序的第三位(或第五位)

管道

管道的作用是对请求的数据进行处理,例如将字符串类型转换为Int类型,便于数据处理,代码如下:

ts 复制代码
@Get(':id')
async findOne(@Param('id', ParseIntPipe) id: number) {
  return this.catsService.findOne(id);
}

所以这一阶段是位于请求之中 了(实际上处于进入路由但没进入路由处理程序的阶段),即拦截器请求之前的下一位,故处于请求流程的第四位

异常过滤器

异常过滤器主要用于抛出错误反馈给客户端,通常结合```try...catch``,代码如下:

ts 复制代码
@@filename(cats.controller)
@Get()
async findAll() {
  try {
    await this.service.findAll()
  } catch (error) {
    throw new HttpException({
      status: HttpStatus.FORBIDDEN,
      error: 'This is a custom message',
    }, HttpStatus.FORBIDDEN, {
      cause: error
    });
  }
}

反馈信息是请求的最后流程,所以异常过滤器是最后执行顺序的最后一步

相关推荐
majingming1232 小时前
FUNCTION
java·前端·javascript
zopple2 小时前
常见的 Spring 项目目录结构
java·后端·spring
SuperEugene3 小时前
Axios 接口请求规范实战:请求参数 / 响应处理 / 异常兜底,避坑中后台 API 调用混乱|API 与异步请求规范篇
开发语言·前端·javascript·vue.js·前端框架·axios
子兮曰4 小时前
Bun v1.3.11 官方更新全整理:新增功能、关键修复与升级验证
javascript·node.js·bun
Setsuna_F_Seiei4 小时前
AI 对话应用之页面滚动交互的实现
前端·javascript·ai编程
cjy0001114 小时前
springboot的 nacos 配置获取不到导致启动失败及日志不输出问题
java·spring boot·后端
wefly20175 小时前
从使用到原理,深度解析m3u8live.cn—— 基于 HLS.js 的 M3U8 在线播放器实现
java·开发语言·前端·javascript·ecmascript·php·m3u8
小江的记录本5 小时前
【事务】Spring Framework核心——事务管理:ACID特性、隔离级别、传播行为、@Transactional底层原理、失效场景
java·数据库·分布式·后端·sql·spring·面试
sheji34165 小时前
【开题答辩全过程】以 基于springboot的校园失物招领系统为例,包含答辩的问题和答案
java·spring boot·后端
程序员cxuan5 小时前
人麻了,谁把我 ssh 干没了
人工智能·后端·程序员