NestJs - 验证对象数组

问题描述 投票:0回答:1

我正在尝试验证对象数组。我尝试了here提到的方法,对于大多数情况都适用。但我面临的问题是,当数组包含另一个数组时,验证不会抛出错误。发送带有字符串的数组时,显示的错误为

must be either object or array
。所以我想它接受一个数组。如何阻止它让数组数组通过?我需要它只接受对象。

有效

{
    "user" : [{ "name" : "kate"}, {"name":"mike"}]
}

应该无效

{
    "user" : [[]]
}

我的验证码

export class UserInfo {
  @ApiProperty({ required: true })
  @IsNotEmpty()
  @IsString()
  name: string;
}

export class User {
  @IsOptional()
  @IsArray()
  @ArrayMinSize(1)
  @ValidateNested()
  @Type(() => UserInfo)
  user: UserInfo;
}
arrays typescript validation nestjs class-validator
1个回答
0
投票

我不明白为什么他们不解决它,花了几个小时找到“正确的方法”来做到这一点,但没有成功

但这就是我针对同一问题的解决方案,但在我的上下文中

import { IsEnum, IsString, ValidateNested } from 'class-validator';
import { Transform, Type } from 'class-transformer';
import { POSTGRESQL_DATA_TYPES_ENUM } from 'src/table/constants';

const isArrayWithNoNestedArrays = (fields) => {
  // early return if fields is not an array
  if (!Array.isArray(fields)) return null;

  return fields.map((field) => {
    // replace array with not valid value
    // in my case it's null here
    if (Array.isArray(field)) return null;
    return field;
  });
};

class Field {
  @IsString()
  name: string;
  @IsEnum(POSTGRESQL_DATA_TYPES_ENUM)
  type: POSTGRESQL_DATA_TYPES_ENUM;
}

export class CreateTableDto {
  @IsString()
  name: string;
  @ValidateNested({ each: true })
  @Type(() => Field)
  @Transform(isArrayWithNoNestedArrays)
  fields: Field[];
}
© www.soinside.com 2019 - 2024. All rights reserved.