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
相关产品推荐
相关产品推荐

