# 前言

Nest.js 在对数据的不同方面进行处理的过程中也提供了多种不同的处理器,包括但不限于:

  1. middleware—— 中间件
  2. Guard—— 守卫
  3. Pipe—— 管道
  4. handler(controller)—— 处理器
  5. Interceptor—— 拦截器
  6. Exception Filter—— 异常过滤器

当一个请求从最上面传过来的时候,如果你将这些处理器全部定义完毕并加以注册使用,那么 Nest.js 会依次调用它们,最终让请求处理完毕后按照期望的格式进行返回,或者应对各种各样的请求错误。

# 具体的处理流程及一般作用

Nest.js数据处理流程图

# 1. 中间件 (Middleware)

中间件是在请求到达路由之前执行的一系列函数。这一层可以复用 express 的中间件生态,实现 session、static files 等功能。这个 middleware 也可以是 Nest 的那种 class 的 middleware,可以注入 provider。

它们可以用于执行以下任务:

  • 验证请求
  • 处理身份验证和授权
  • 记录请求
  • 修改请求或响应
  • 处理跨域请求 (CORS)

# 2. 守卫 (Guard)

守卫用于控制对路由的访问权限。Guard 一般是以路由为单位进行配置,使用装饰器配置在具体的每个 Controller 对应的路由上。在具体的路由会经历 Guard 的处理,它可以通过 ExecutionContext 拿到目标 class、handler 的 metadata 等信息,可以实现权限验证等功能。

它们可以根据以下条件来允许或拒绝访问:

  • 用户是否登录
  • 用户是否具有特定角色或权限
  • 请求是否来自特定 IP 地址

# 3. 管道 (Pipe)

管道用于对请求和响应数据进行转换和验证。它们可以用于以下任务:

  • 将请求参数转换为特定类型
  • 验证请求参数
  • 将响应数据格式化为 JSON 或其他格式

# 4. 处理器 (Handler/Controller)

处理器负责处理请求并生成响应,一般就是用来配置路由以及请求的方法。并且一般都是调用 Service 中的方法进行逻辑处理,减少耦合。

# 5. 拦截器 (Interceptor)

拦截器可以拦截请求和响应的生命周期。可以在请求前后做一些处理,它也可以通过 ExecutionContext 拿到 class、handler 的信息。

它们可以用于以下任务:

  • 记录请求和响应
  • 修改请求或响应
  • 处理错误

# 6. 异常过滤器 (Exception Filter)

异常过滤器用于处理应用程序中的异常。它们可以用于以下任务:

  • 记录异常
  • 将异常信息发送给用户
  • 重定向用户到错误页面