我正在尝试验证对象数组。我尝试了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;
}
我不明白为什么他们不解决它,花了几个小时找到“正确的方法”来做到这一点,但没有成功
但这就是我针对同一问题的解决方案,但在我的上下文中
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[];
}