我有一个像这样的DTO,我试图允许
string
和array
并验证它是string
还是array
。
export class MyRequestDto extends SomeBaseRequestDto {
@IsOptional()
@IsString()
key?: string;
}
当我请求这个
http://localhost:3000/path?key=123asd
时,它就起作用了。
但是,当我尝试发出此请求时http://localhost:3000/path?key=123asd&key=321asd
,它不起作用并发送错误“别名必须是字符串”
当我尝试这样的事情时,效果非常好,
export class MyRequestDto extends SomeBaseRequestDto {
@IsOptional()
key?: string | string[];
}
我不想这样做,因为我需要验证它是
array
还是 string
。你知道我该怎么做吗?
我尝试通过这些方式更改DTO,
@IsOptional()
@IsArray()
@IsString({ each: true, message: "Each item should be string" })
并且,
@IsOptional()
@IsArray()
@IsString()
并且,
@IsOptional()
@IsString()
@IsArray()
并且,
@IsOptional()
要实现此目的,您必须创建一个自定义验证。
类似问题:我的类验证器如何验证联合字符串 |号码?
@ValidatorConstraint({ name: 'string-or-array', async: false })
export class IsStringOrArray implements ValidatorConstraintInterface {
validate(input: any, args: ValidationArguments) {
return typeof input === 'string' || Array.isArray(input);
}
defaultMessage(args: ValidationArguments) {
return '($value) must be string or array';
}
}
然后你必须像这样使用它,
export class MyRequestDto extends SomeBaseRequestDto {
@IsOptional()
@Validate(IsStringOrArray)
key?: string | string[];
}