嵌套js d以允许字符串数组并且仅允许字符串

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

我有一个像这样的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()
javascript nestjs dto
1个回答
0
投票

要实现此目的,您必须创建一个自定义验证

类似问题:我的类验证器如何验证联合字符串 |号码?

@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[];
}
© www.soinside.com 2019 - 2024. All rights reserved.