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

Nest.js中class-validator验证Record类型JSON对象失败问题

解决NestJS中Record类型的DTO验证问题

你的问题出在@ValidateNested装饰器的配置上,默认情况下它只会验证当前对象的直接属性,而不会遍历Record<string, User>中的每个值进行验证。以下是修正后的代码:

import { Type } from 'class-transformer';
import {
  IsNotEmpty,
  IsString,
  ValidateNested,
  IsInt,
  IsObject,
} from 'class-validator';

class User {
  @IsNotEmpty()
  @IsString()
  name: string;

  @IsNotEmpty()
  @IsString()
  uid: string;

  @IsNotEmpty()
  @IsInt()
  age: number;
}

export class CreateUserDto {
  @IsNotEmpty()
  @IsObject()
  // 添加each: true,告诉验证器遍历对象的每个值进行验证
  @ValidateNested({ each: true })
  // Type装饰器会自动将Record的每个值转换为User类实例,配合验证器工作
  @Type(() => User)
  registrations: Record<string, User>;
}

关键说明:

  • @ValidateNested({ each: true }):启用后,验证器会递归验证registrations这个对象里的每一个值(也就是每个User实例),而不是去验证registrations自身的属性。
  • 确保你的NestJS应用全局验证管道开启了transform: true,否则class-transformer无法将JSON数据转换为对应的类实例,验证规则会失效。在main.ts中配置:
    import { ValidationPipe } from '@nestjs/common';
    
    async function bootstrap() {
      const app = await NestFactory.create(AppModule);
      app.useGlobalPipes(new ValidationPipe({
        transform: true, // 必须开启,实现类转换
        whitelist: true, // 可选,自动移除DTO中未定义的属性
      }));
      await app.listen(3000);
    }
    bootstrap();
    

这样修改后,提交你提供的JSON数据时,验证器会正确遍历registrations下的每个用户条目,按照User类的规则进行验证。

内容的提问来源于stack exchange,提问作者thewebjackal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 23:47:09