NestJS如何验证对象数组,阻止嵌套数组通过验证?
解决class-validator允许嵌套数组通过验证的问题
核心问题分析
你当前的代码存在两个关键问题:
User类中user字段的类型声明错误,应为UserInfo[]而非UserInfo,导致类型校验逻辑不匹配- 缺少对数组元素类型的明确限制,仅靠
ValidateNested和Type无法拦截非对象类型的数组元素(比如嵌套数组)
修正后的验证代码
import { ApiProperty } from '@nestjs/swagger'; import { IsNotEmpty, IsString, IsOptional, IsArray, ArrayMinSize, ValidateNested, Type, IsObject } from 'class-validator'; export class UserInfo { @ApiProperty({ required: true }) @IsNotEmpty() @IsString() name: string; } export class User { @IsOptional() @IsArray() @ArrayMinSize(1) // 对数组中的每个元素单独执行嵌套验证 @ValidateNested({ each: true }) // 指定数组元素的类型为UserInfo @Type(() => UserInfo) // 强制要求数组中每个元素必须是对象,拦截嵌套数组、字符串等非对象类型 @IsObject({ each: true }) user: UserInfo[]; }
关键改动说明
- 修正字段类型:将
user: UserInfo改为user: UserInfo[],与数组校验逻辑对齐 - 添加@IsObject({ each: true }):遍历数组每一项,强制要求每一项为对象类型,直接拦截嵌套数组、字符串等非对象元素
- 保留@ValidateNested({ each: true }):确保每个对象元素按照
UserInfo的规则完成深层验证
验证效果
- 有效示例(通过校验):
{ "user" : [{ "name" : "kate"}, {"name":"mike"}] }
- 无效示例(被拦截,提示
each value in user must be an object):
{ "user" : [[]] }
内容的提问来源于stack exchange,提问作者Zephyr
相关产品推荐
相关产品推荐

