nestjs中如何使用class-validator和class-transformer

2024-04-22 10:32:28 浏览数 (2)

前面两篇文章分别介绍了class-validator和class-transformer的使用,接着聊一下如何在nestjs中使用这两个包。

Nest.js自带数据验证,自带了三个开箱即用的管道:ValidationPipe、ParseIntPipe和ParseUUIDPipe, 其中ValidationPipe 配合class-validator就可以完美的实现我们想要的效果(对参数类型进行验证,验证失败抛出异常)。

管道验证操作通常用在dto这种传输层的文件中,用作验证操作。首先我们安装两个需要的依赖包:class-transformer和class-validator。

代码语言:bash复制
npm install class-validator class-transformer -S

然后在xxxx.dto.ts文件中添加验证, 完善错误信息提示:

代码语言:ts复制
import { IsNotEmpty, IsNumber, IsString } from 'class-validator';

export class CreatePostDto {
  @ApiProperty({ description: '文章标题' })
  @IsNotEmpty({ message: '文章标题必填' })
  readonly title: string;

  @IsNotEmpty({ message: '缺少作者信息' })
  @ApiProperty({ description: '作者' })
  readonly author: string;

  @ApiPropertyOptional({ description: '内容' })
  readonly content: string;

  @ApiPropertyOptional({ description: '文章封面' })
  readonly cover_url: string;

  @IsNumber()
  @ApiProperty({ description: '文章类型' })
  readonly type: number;
}

在路由中配置DTO对象:

代码语言:ts复制

@controller()
class etesxcontroller{
    @post()
     hello(@body(new testpipe()) post:CreatePostDto){}
     
     //testpipe 入参value就是dto可以修改dto的value
     
}

最后我们还有一个重要的步骤, 就是在main.ts中全局注册一下管道ValidationPipe:

代码语言:ts复制
app.useGlobalPipes(new ValidationPipe());

ValidationPipe的处理步骤 :

  1. 先将传进来普通对象通过 class-transformer 包的 plainToClass 函数转化成 dto 类的实例.
  2. 将得到的这个 dto 实例通过 class-validator 包的 validate 函数进行验证,validate 函数同时会对 dto 实例进行相应处理(比如,设置了 whitelist, 会删除没有被 class-Validator 装饰器装饰的属性)
  3. 将这个 dto 实例再次通过 class-transformer 包的 classToPlain 函数将 dto 实例转化成普通对象
  4. controller 方法收到相应参数

当然了,这是nestjs借助了ValidationPipe使用class-validator和calss-transformer,我们也可以自定义pipe来使用这两个包。

以上便是nestjs中如何使用class-validator和class-transformer,希望对你有所帮助。

0 人点赞