NestJs 管道(Pipe)

🎄Hi~ 大家好,我是小鑫同学,资深 IT 从业者,InfoQ 的签约作者,擅长前端开发并在这一领域有多年的经验,致力于分享我在技术方面的见解和心得

🚀技术&代码分享

  • 我在 94Code 总结技术学习;
  • 我在 1024Code 在线编写代码;
  • 我在 Github 参与开源学习;

😇推荐几个好用的工具

进入正题

Nestjs 中管道是具有 @Injectable() 装饰器且已实现 PipeTransform 接口的类。

管道(Pipe)的作用

管道(Pipe)作用在每个控制器的处理方法上,也就是当每一个请求被路由到具体的控制器的方法后会先通过管道(Pipe)对传入的请求参数进行 转换验证,保证数据在被正式处理前是完全合法的。

管道(Pipe)的使用

Nestjs 中内置了下列的9个管道,利用这些管道可以轻松的验证路由参数、查询参数和请求正文是否合法,下面通过两个例子一起看一下管道的使用。

ParseIntPipe ParseFloatPipe
ParseBoolPipe ParseArrayPipe
ParseUUIDPipe ParseEnumPipe
ParseFilePipe
DefaultValuePipe ValidationPipe

findUserById 是用来根据用户 ID 获取用户信息的处理函数,期望id由客户端传来的必须是数字类型。

@Controller('users')
export class UsersController {
   
   
  @Get(':id')
  findUserById(@Param('id') id: number): string {
   
   
    return `The ID of this user is ${
     
     id}`;
  }
}

现在由于缺少对路由参数类型的校验,此时客户端在传递非数字类型的ID时并不会收到合理的提醒,这样很容易造成服务端业务逻辑的异常,有入库的操作的话还会造成垃圾数据。所以可将 ParseIntPipe 管道类直接添加到 @Param() 装饰器的第二位参数,如下图:

@Controller('users')
export class UsersController {
   
   
  @Get(':id')
  findUserById(@Param('id', ParseIntPipe) id: number): string {
   
   
    return `The ID of this user is ${
     
     id}`;
  }
}

增加 ParseIntPipe 管道的限制后,当客户端再次传递非数字类型的ID时就会收到对应的提示。

上面的例子中使用了管道类而非管道的实例是因为 Nestjs 基于 IoC 的设计在框架内部可以自动对类进行实例化操作,管道同时也支持通过构造函数传递选项的方式自定义内置管道的行为。

下面这个 findUserByUUID 函数中使用的 ParseUUIDPipe 管道默认情况下是支持接收不同版本的 UUID 的,但在例子中我们限制只可以接收 v5 版本的 UUID,就需要实例化 ParseUUIDPipe 并在构造函数中指定具体的 version

@Get(':uuid')
findUserByUUID(
    @Param('uuid', new 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前端小鑫同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值