typescript - 当单个项目来自查询参数时如何传递类验证器@isArray

标签 typescript validation nestjs class-validator

我正在尝试使用 class-validator 验证请求如果它是数组。

输入来自查询参数 /api/items?someTypes=this

我的请求 dto 看起来像这样。

    (...)
    @IsArray()
    @IsEnum(SOMETHING, {each: true})
    readonly someTypes: keyof typeof SOMETHING[];
    (...)

当我只给出一项时,@IsArray 给出验证错误,说它不是数组。

当一项来自查询参数时,我也想将其设置为数组,但我不知道如何操作。

我知道使用 /api/items?someTypes[]=this 将通过验证。

但我想知道是否有其他方法可以解决这个问题。

最佳答案

如果您的字段是一个数组,并且您想要对数组中的每个项目执行验证,则必须传递特殊的 each: true @IsEnum() 的选项装饰器。

import { IsArray, IsEnum } from 'class-validator';

enum SomeType {
  A,
  B,
  C,
}

class SearchQuery {
  @IsArray()
  @IsEnum(SomeType, { each: true })
  types: SomeType[];
}


@Controller()
export class AppController {
  @Get()
  async search(@Query() searchQuery: SearchQuery): Promise<void> 
  { ... }
}

然后,您可以使用以下语法向端点执行 GET 请求。

?types[]=A&types[]=B&types[]=C

当您只传递一项时,效果非常好。

?types[]=A

如果您不喜欢这种语法并且更喜欢 types=A,B,C那么你可以组合class-validatorclass-tranformer .

class SearchQuery {
  @IsArray()
  @IsEnum(SomeType, { each: true })
  @Transform(({ value }) =>
    value
      .trim()
      .split(',')
      .map((type) => SomeType[type]),
  )
  types: SomeType[];
}

关于typescript - 当单个项目来自查询参数时如何传递类验证器@isArray,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72921086/

相关文章:

node.js - 为什么我收到无法确定 GraphQL 输出错误?

typescript - Vue Typescript 组件类属性初始化器的最佳实践

javascript - 告诉 Chrome 调试 js 而不是 ts

Angular:为什么 http 调用在 ngOnInit 中起作用,而不是在点击事件中起作用? (与缓存有关)

javascript - 用于分页的 RXJS while 循环

node.js - NestJS MQTT 微服务的有效@MessagePattern 是什么?

ruby - 使用嵌入文档时的 ActiveRecord 嵌套验证 : Mongoid

ruby-on-rails - 真的需要验证外键吗?

java - 添加 Swing 验证

nestjs - 如何在 main.ts 文件中使用配置模块