NestJS中如何通过Class Validator向嵌套对象传递父类属性?
解决NestJS嵌套验证中传递父类属性给子验证器的问题
class-validator的嵌套验证器默认无法直接获取父类对象的属性,这里提供一种直接可行的方案:将嵌套数组的验证逻辑移到父类的自定义验证器中,这样就能同时拿到gradingSystem和currentGrades的信息。
具体步骤:
- 调整
CurrentGradeDto结构:移除grade字段上的@Validate(GradeValidator)装饰器,后续验证逻辑放到父类层面处理。 - 编写父类自定义验证器:创建针对
OnboardDto中currentGrades的验证器,在其中结合gradingSystem对每个成绩进行校验。
代码示例:
自定义父类验证器(OnboardGradesValidator)
import { ValidatorConstraint, ValidatorConstraintInterface, ValidationArguments } from 'class-validator'; import { GradeValidator } from './grade.validator'; // 引入原有的GradeValidator逻辑 @ValidatorConstraint({ name: 'onboardGrades', async: false }) export class OnboardGradesValidator implements ValidatorConstraintInterface { validate(currentGrades: CurrentGradeDto[], args: ValidationArguments) { // 获取父类的gradingSystem属性 const { gradingSystem } = args.object as OnboardDto; const gradeValidator = new GradeValidator(); // 遍历每个成绩,结合评分系统验证 for (const item of currentGrades) { // 调用原GradeValidator的验证逻辑,传入gradingSystem参数 if (!gradeValidator.validate(item.grade, { gradingSystem })) { return false; } } return true; } defaultMessage(args: ValidationArguments) { return `存在不符合${(args.object as OnboardDto).gradingSystem}评分系统规则的成绩`; } }
修改后的Dto类
import { Type } from 'class-transformer'; import { OnboardGradesValidator } from '../validation'; import { IsIn, Validate, ValidateNested } from 'class-validator'; export class CurrentGradeDto { grade: string; } export class OnboardDto { @IsIn(['system1', 'system2', 'system3', 'system4']) gradingSystem: string; @ValidateNested({ each: true }) @Type(() => CurrentGradeDto) @Validate(OnboardGradesValidator) // 新增父类验证器 currentGrades: CurrentGradeDto[]; }
补充说明:
- 如果原
GradeValidator是异步验证逻辑,记得将ValidatorConstraint的async设为true,并在validate方法中使用await调用异步验证逻辑。 - 这种方式避免了嵌套验证器无法访问父类属性的问题,逻辑更清晰,也便于维护。
内容的提问来源于stack exchange,提问作者ktop
相关产品推荐
相关产品推荐

