Nest.js 实战 (四):利用 Pipe 管道实现数据验证和转换

什么是管道(Pipe)?

Nest.js 中,管道(Pipelines) 是一种强大的功能,用于预处理进入控制器方法的请求数据,如请求体、查询参数、路径参数等。管道允许开发者在数据到达控制器方法之前对数据进行转换、验证、清理或执行其他预处理任务。这使得 Nest.js 应用更加健壮、可维护和一致。

以下是 Nest.js 中管道的一些主要用途:

  • 数据转换:管道如 ParseIntPipeParseFloatPipeParseArrayPipe 等可以将原始输入数据转换为应用内部所需的类型,如将字符串转换为整数或浮点数,或将字符串表示的数组转换为数组,保证了数据的一致性和可用性
  • 数据验证:管道可以确保传入的数据符合预期的格式和规则。例如,使用 ValidationPipe 结合 class-validator,可以自动验证请求体或查询参数是否满足特定的 DTO(数据传输对象)定义,从而预防因数据格式错误引起的运行时异常
  • 错误处理:如果数据不符合管道的规则,管道可以抛出异常,从而阻止请求的进一步处理,并向客户端返回适当的错误信息
  • 一致性:管道有助于在整个应用中保持一致性,避免在不同的控制器或方法中重复相同的预处理逻辑
  • 可插拔性和重用性:管道是可插拔的组件,可以很容易地在多个控制器或方法之间共享和重用

内置管道

Nest.js 自带九个开箱即用的管道:

  • ValidationPipe:验证和转换传入的数据。它使用 class-validator 库来检查数据是否符合定义在 DTOs 或请求模型上的验证规则
  • ParseIntPipe:将字符串类型的参数转换为整数
  • ParseFloatPipe:将字符串类型的参数转换为浮点数
  • ParseBoolPipe:将字符串类型的参数转换为布尔值
  • ParseArrayPipe:将字符串形式的数组转换为数组
  • ParseUUIDPipe:解析字符串并验证是否为 UUID
  • ParseEnumPipe:将传入的值转换为枚举类型中的成员
  • DefaultValuePipe:如果传入的参数是 undefinednull,则使用默认值替换它
  • ParseFilePipe:用于处理上传的文件,它可以验证文件的类型、大小等,确保上传的文件符合预期

自定义管道

  1. 安装依赖
pnpm add class-validator class-transformer
  1. 新建 /pipe/validation.pipe.ts 文件:
import {
    ArgumentMetadata, BadRequestException, Injectable, PipeTransform } from '@nestjs/common';
import {
    plainToClass } from 'class-transformer';
import {
    validate } from 'class-validator';

@Injectable()
export class ValidationPipe implements PipeTransform {
   
  async transform(value: any, {
    metatype }: ArgumentMetadata) {
   
    if (!metatype || !this.toValidate(metatype)) {
   
      // 如果没有传入验证规则,则不验证,直接返回数据
      return value
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

白雾茫茫丶

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

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

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

打赏作者

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

抵扣说明:

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

余额充值