谈谈 NestJs中管道的使用

1,275 阅读2分钟

「这是我参与2022首次更文挑战的第5天,活动详情查看:2022首次更文挑战

管道

在Nest的生命周期中,客户端发起一个请求后,服务器接到请求内容,经过中间件,守卫,拦截器,管道,真正业务逻辑处理,拦截器,请求结束返回内容。而管道是处于请求过程中第四个内容,主要是用于对请求参数的验证和转换操作。

  • 转换:将输入数据转换成所需的数据输出
  • 验证:对输入数据进行验证,若验证成功者继续传递,否则将抛出异常

内置管道

ValidationPipe

在之前写过的一篇关于的 class-validator 的文章,谈到过 验证管道的使用,详细的使用可以打开链接访问。

主要是基于class-validator和class-transformer 封装了验证管道然后在 NestJs 全局验证管道中使用,可以从class-validator导入配置规则,然后直接使用验证。

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.useGlobalPipes(new ValidationPipe());
  await app.listen(3000);
}
bootstrap();

ParseIntPipe 和 ParseUUIDPipe

  • ParseIntPipe 管道主要是用于将传入的参数转换为数字。
@Get(':id')
findOne(@Param('id', UserByIdPipe) userEntity: UserEntity) {
  return userEntity;
}
  • ParseUUIDPipe 管道主要用于验证字符串是否是 UUID。

这两个就是转换管道。转换管道被插入在客户端请求和请求处理程序之间用来处理客户端请求。

场景1:当从客户端传来的数据需要经过一些修改(例如字符串转化为整数),然后处理函数才能正确的处理。

场景2:有些数据具有默认值,用户不必传递带默认值参数,一旦用户不传就使用默认值。

自定义管道

管道是具有 @Injectable() 装饰器的类。管道应实现 PipeTransform 接口。、

定义

export class CustomPipe implements PipeTransform<any> {
  
  async transform(value: any, {metatype}: ArgumentMetadata){
     /*** 业务逻辑实现 **/ 
  }
}

使用

1、单个请求参数的绑定;导入管道 ValidationPipe 然后直接在内容中 new 即可

2、单个路由绑定:导入管道 ValidationPipe 然后使用 @UsePipes 装饰器

3、全局绑定:在main.ts中处理,app.useGlobalPipes(new CustomPipe())

不知不觉变成了重学 Nestjs 系列了,其他相关的 NestJs 内容,快速访问地址:

NestJs重学系列整合

\