Skip to content

nest学习笔记

以下为nest学习过程中基于基于个人理解整理的笔记

控制器

控制器负责处理传入的请求并向客户端返回响应

用类和装饰器进行实现,主要的装饰器:Controller、请求方法、请求对象、状态码、响应头、重定向

返回支持async异步及RxJS可观察流

支持复杂查询参数,根据内置框架是Express或Fastify,有不同方式,或者使用qs这个库

plaintext
?filter[where][name]=John&filter[where][age]=30
?item[]=1&item[]=2

提供者

基础的 Nest 类(如服务、存储库、工厂和辅助工具)都可以被视为提供者

需要使用@Injectable()来标记提供者,注入到到控制反转容器

核心设计模式:依赖注入控制反转

模块

模块是一个用 @Module() 装饰器注解的类。该装饰器提供了元数据,Nest 使用它来有效地组织和管理应用程序结构

模块是单例的,方便跨模块共享

可以使用@Global()全局注入模块

可以创建动态模块在运行时配置,感觉可以用来做低代码

中间件

Expressfastify 处理中间件的方式不同具体参考文档

需要用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来组合装饰器,示例:

typescript
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 函数一起使用。

鄂ICP备19018246号-1