NestJS接收@Body()后如何用class-validator重新验证对象?
嵌套DTO验证规则不生效的解决办法
问题现象
使用class-validator和class-transformer时,基础字段的验证能正常工作,但当DTO中包含嵌套的子DTO时,子DTO的验证规则完全不生效,调用validate后返回空数组[]。
复现代码
业务执行代码:
import { validate } from 'class-validator'; import { plainToClass } from 'class-transformer'; import { MyDTO } from './MyDTO'; const body = { datas: { name: 'John' } }; // name长度不符合DataDTO的10-30要求 const myDtoInstance = plainToClass(MyDTO, body); console.log(await validate(myDtoInstance)) // 输出[],未触发预期验证
原始DTO结构:
class MyDTO { datas: DataDTO } class DataDTO{ @Length(10,30) name: string }
解决方法
要让嵌套DTO的验证规则生效,需要给父DTO中的嵌套字段添加两个关键装饰器:
@Type(() => DataDTO):指定class-transformer将普通对象转换为对应DTO类的实例@ValidateNested():告知class-validator需要对该嵌套对象执行验证逻辑
修改后的DTO代码
import { ValidateNested, Length } from 'class-validator'; import { Type } from 'class-transformer'; class MyDTO { @ValidateNested() @Type(() => DataDTO) datas: DataDTO } class DataDTO{ @Length(10,30) name: string }
验证逻辑无需修改
保持原有业务执行代码不变,重新运行后,validate会返回符合预期的错误信息(比如name长度不符合要求的验证提示)。
内容的提问来源于stack exchange,提问作者Dewvie
相关产品推荐
相关产品推荐

