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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 13:03:30