nest 中的时序
middleware INPUT -> guard -> middleware OUTPUT -> interceptor INPUT -> pipe -> controller -> interceptor OUTPUT
Middleware(中间件)
Middleware 是在路由处理程序之前调用的函数。中间件函数可以访问请求和响应对象,以及应用程序的请求-响应周期中的 next() 中间件函数。next 中间件函数通常由名为 next 的变量表示。默认情况下,Nest 中间件等同于 express 中间件。
import { Injectable, NestMiddleware } from '@nestjs/common'
import { Request, Response, NextFunction } from 'express'
@Injectable()
export class LoggerMiddleware implements NestMiddleware {
use(req: Request, res: Response, next: NextFunction) {
console.log('Request...')
next()
}
}Pipes 管道
管道是一个用 @Injectable() 装饰器注释的类,它实现了 PipeTransform 接口。
管道有两个典型的用例:
- transformation:将输入数据转换为所需的形式(例如,从 String 到 Integer)
- validation:评估输入数据,如果有效,只需将其原封不动地传递即可;否则,抛出异常
在这两种情况下,管道都对控制器路由处理程序正在处理的参数进行操作。Nest 在调用方法之前插入一个管道,管道接收发往该方法的参数并对其执行操作。任何转换或验证操作都发生在该时间,之后将使用任何(可能)转换的参数调用路由处理程序。
Guards 警卫
守卫是一个用 @Injectable() 装饰器注释的类,它实现了 CanActivate 接口。
警卫只有一项职责。它们根据运行时存在的某些条件(如权限、角色、ACL 等)确定给定请求是否由路由处理程序处理。这通常称为授权。授权(及其表亲 authentication,它通常与之协作)通常由传统 Express 应用程序中的中间件处理。中间件是身份验证的不错选择,因为令牌验证和将属性附加到请求对象之类的事情与特定的路由上下文(及其元数据)没有紧密联系。
守卫在所有 middleware 之后执行,但在任何拦截器或管道之前执行。
守卫引发的任何异常都将由异常层(全局异常过滤器和应用于当前上下文的任何异常过滤器)处理。
Interceptors 拦截器
拦截器是一个用 @Injectable() 装饰器注释的类,并实现 NestInterceptor 接口。
Exception filters(异常过滤器)
Nest 带有一个内置的异常层,该层负责处理应用程序中所有未处理的异常。当应用程序代码未处理异常时,该层会捕获该异常,然后该层会自动发送适当的用户友好响应。