class-validator检验嵌套参数
问题背景
本人使用的是nestjs框架,参数检验部分使用class-validator进行常见的验证,包括类型检验、值检验等。但当参数为嵌套对象时,如果使用常规的IsObject注解会无法检验到嵌套结构的内部。结构如下:
class Address {
@IsString()
addressName: string;
@IsNumber()
addressCode: number;
}
class User {
@IsString()
userName: string;
@IsObject()
address: Address;
}
当使用上述结构时,由于IsObject只能检验User的address属性是否是对象,无法对其内部使用已经定义好的检验方式进行检验(上述Address中的IsString与IsNumber无效)
解决方法
先说结论,使用ValidateNested与Type注解结合使用,可进行嵌套结构的检验。
以下是寻找解决方案的心路历程:
查看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;
}

浙公网安备 33010602011771号