前面两篇文章分别介绍了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的处理步骤 :
- 先将传进来普通对象通过 class-transformer 包的 plainToClass 函数转化成 dto 类的实例.
- 将得到的这个 dto 实例通过 class-validator 包的 validate 函数进行验证,validate 函数同时会对 dto 实例进行相应处理(比如,设置了 whitelist, 会删除没有被 class-Validator 装饰器装饰的属性)
- 将这个 dto 实例再次通过 class-transformer 包的 classToPlain 函数将 dto 实例转化成普通对象
- controller 方法收到相应参数
当然了,这是nestjs借助了ValidationPipe使用class-validator和calss-transformer,我们也可以自定义pipe来使用这两个包。
以上便是nestjs中如何使用class-validator和class-transformer,希望对你有所帮助。