class-validator检验嵌套参数

问题背景

本人使用的是nestjs框架,参数检验部分使用class-validator进行常见的验证,包括类型检验、值检验等。但当参数为嵌套对象时,如果使用常规的IsObject注解会无法检验到嵌套结构的内部。结构如下:

class Address {
  @IsString()
  addressName: string;

  @IsNumber()
  addressCode: number;
}

class User {
  @IsString()
  userName: string;

  @IsObject()
  address: Address;
}

当使用上述结构时,由于IsObject只能检验Useraddress属性是否是对象,无法对其内部使用已经定义好的检验方式进行检验(上述Address中的IsStringIsNumber无效)

解决方法

先说结论,使用ValidateNestedType注解结合使用,可进行嵌套结构的检验。

以下是寻找解决方案的心路历程:

查看class-validator的npm网站,其中插件特性介绍中是有关于nest结构(嵌套结构)的说明:

点击上图中的链接,查看相关内容如下:

此时是不是好像看到了希望的曙光,但按照上述方式进行代码编写,你会发现依旧无法生效。再次查看说明,其中一句话非常重要:

Please note that nested object must be an instance of a class, otherwise @ValidateNested won't know what class is target of validation.Check also Validating plain objects.

意思是嵌套的对象必须是一个明确的class类,如果不定义的话,ValidateNested是无法知道检验对象的。此时需要根据提示查看Validating plain objects

此时提示需要结合class-transformer进行使用。class-transformer中有相关说明:

这时就可以找到解决方法了,在ValidateNested的基础上,再次增加Type注解,即可对嵌套结构进行检验。示例代码如下:

import { Type } from 'class-transformer';
import { IsNumber, IsString, ValidateNested } from 'class-validator';

class Address {
  @IsString()
  addressName: string;

  @IsNumber()
  addressCode: number;
}

class User {
  @IsString()
  userName: string;

  @ValidateNested()
  @Type(() => Address)
  address: Address;
}
posted @ 2021-07-12 15:14  Mr_Kahn  阅读(1984)  评论(1)    收藏  举报