nest学习笔记
以下为nest学习过程中基于基于个人理解整理的笔记
控制器
控制器负责处理传入的请求并向客户端返回响应
用类和装饰器进行实现,主要的装饰器:Controller、请求方法、请求对象、状态码、响应头、重定向
返回支持async异步及RxJS可观察流
支持复杂查询参数,根据内置框架是Express或Fastify,有不同方式,或者使用qs这个库
?filter[where][name]=John&filter[where][age]=30
?item[]=1&item[]=2提供者
基础的 Nest 类(如服务、存储库、工厂和辅助工具)都可以被视为提供者
需要使用@Injectable()来标记提供者,注入到到控制反转容器
核心设计模式:依赖注入控制反转
模块
模块是一个用 @Module() 装饰器注解的类。该装饰器提供了元数据,Nest 使用它来有效地组织和管理应用程序结构
模块是单例的,方便跨模块共享
可以使用@Global()全局注入模块
可以创建动态模块在运行时配置,感觉可以用来做低代码
中间件
Express 和 fastify 处理中间件的方式不同具体参考文档
需要用impl实现去实现common包中的Middleware类和Module类
具体的Module中支持对路由及请求方式配置,支持多个及全局配置
异常过滤器
内置标准异常如HttpException类,会被视为正常流程的一部分,不会被控制台记录
可以用@Catch类修饰器自定义异常过滤器,可以集成基础异常过滤器类BaseExceptionFilter
支持app.useGlobalFilters全局使用,或@UseFilters类修饰器在具体控制器中
管道
管道是一个用 @Injectable() 装饰器注解的类,它实现了 PipeTransform 接口。
管道有两种典型用例:
- 转换 :将输入数据转换为所需形式(例如从字符串转换为整数)
- 验证 :评估输入数据,若有效则原样传递;否则抛出异常
nest有多种内置的管道,并支持实现PipeTransform自定义管道
管道通常在参数装饰器中使用,支持全局管道
守卫
守卫是一个用 @Injectable() 装饰器注解的类,它实现了 CanActivate 接口。
守卫常用于权限控制
可以使用app.useGlobalGuards设置全局守卫
推荐使用@nestjs/core中的Reflector创建自定义装饰器,并在守卫中获取装饰器信息并进行去权限控制
拦截器
拦截器是一个用 @Injectable() 装饰器注解并实现了 NestInterceptor 接口的类。
与管道和守卫类似,拦截器可以作用于控制器范围、方法范围或全局范围
常与RxJS结合使用做更精细的控制
常见场景:日志
自定义路由装饰器
Nest 的核心构建基于一种称为装饰器的语言特性。
使用@nestjs/common中的createParamDecorator创建自定义装饰器
可以通过@nestjs/common中的applyDecorators来组合装饰器,示例:
import { applyDecorators } from '@nestjs/common';
export function Auth(...roles: Role[]) {
return applyDecorators(
SetMetadata('roles', roles),
UseGuards(AuthGuard, RolesGuard),
ApiBearerAuth(),
ApiUnauthorizedResponse({ description: 'Unauthorized' }),
);
}
// 从 @nestjs/swagger 包引入的 @ApiHideProperty() 装饰器不可组合,并且无法与 applyDecorators 函数一起使用。