class-validator用法

959 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第4天,点击查看活动详情

前言

自从出现 typeScript 之后就发现用 ts 写后端也是一模一样的的结果,从基本controller 到service 层层划分功能模块。主要还是依赖着 nest 框架。其中在入参校验使用class-validator 校验器,简直不要太方便。

class-validator 使用

  • 先通过自定义一个全局的 pipe,validator- pipe,在项目启动时需要注册该pipe
  • post 请求中所有的 body 参数都转成 class 对象。在 nest 框架中,可以通过注解的方式给参数字段加上校验规则

以 Controller body 参数的为例子,说下常用几种例子:

  • IsOptional() 选填字段校验,如果是选填的,需要再加上另外校验
  // namespace 是选填字段,如果有字段,值至少长度为1 ,
  // MinLength(1) 用于非空传递,也可以使用 IsNotEmpty()
// 支持自定义错误信息

  @IsOptional({message:"不是字符串"})
  @MinLength(1)
  namespace: string;
  • @IsArray() 是数组类型
// 是数组类型,且数组长度最小为1
  @ArrayMinSize(1)
  @IsString({each:true})
  codes: string[];
  • @IsObject 是对象类型 。在项目尽量不用 any 而是具体到具体的数据类型,这样对数据校验才能更加更准确
  // 对于键值对的类型直接使用
  @IsObject()
  value : KeyValuePair // 引用的是 common/types
  • IsEnum 枚举类型
  @IsEnum(targetType)
  type: targetType;
  • IsInt 类型。若是对于一些数字类型,可加上区间,不如分页最大数据量 limit 不能为负数。
  @IsInt()
  @Min(1)
  limit : number
  • 其他类型
@IsBoolean()检查值是布尔型
@IsDate()检查值是日期
@IsString()检查值是字符串
@IsNumber(options: IsNumberOptions)检查值是数字
@IsInt()检查值是整数
@IsArray()检查值是数组
@IsEnum(entity: object)检查值是有效枚举

高级用法

多条件限制,强制限制数据类型

@IsNumber()
@Min(1)
@Type(() => Number)

嵌套对象的校验,即用这个装饰器标记的对象/对象数组也将被验证。

@ValidateNested()

@Type(() => User)

还有很多用法,具体场景可以根据class-validator 的官方文档查看。