You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NestJS中如何通过Class Validator向嵌套对象传递父类属性?

解决NestJS嵌套验证中传递父类属性给子验证器的问题

class-validator的嵌套验证器默认无法直接获取父类对象的属性,这里提供一种直接可行的方案:将嵌套数组的验证逻辑移到父类的自定义验证器中,这样就能同时拿到gradingSystem和currentGrades的信息。

具体步骤:

  1. 调整CurrentGradeDto结构:移除grade字段上的@Validate(GradeValidator)装饰器,后续验证逻辑放到父类层面处理。
  2. 编写父类自定义验证器:创建针对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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 16:05:25