# 前言
Nest.js 在对数据的不同方面进行处理的过程中也提供了多种不同的处理器,包括但不限于:
- middleware—— 中间件
- Guard—— 守卫
- Pipe—— 管道
- handler(controller)—— 处理器
- Interceptor—— 拦截器
- Exception Filter—— 异常过滤器
当一个请求从最上面传过来的时候,如果你将这些处理器全部定义完毕并加以注册使用,那么 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)
异常过滤器用于处理应用程序中的异常。它们可以用于以下任务:
- 记录异常
- 将异常信息发送给用户
- 重定向用户到错误页面