NestJS Swagger - 如何声明多选枚举字段?

Posted

技术标签:

【中文标题】NestJS Swagger - 如何声明多选枚举字段?【英文标题】:NestJS Swagger - How to declare multiselect enum field? 【发布时间】:2019-09-10 01:48:16 【问题描述】:

我在我的应用程序中使用@nestjs/swagger 模块。我想为我的查询参数之一声明多选枚举字段。我在文档中读到,我可以通过结合 enumisArray 属性来实现这一点。所以我做了类似的事情:

class QueryParams 
  @ApiModelProperty(
    enum: ['test_status_1', 'test_status_2'],
    isArray: true
  )
  status: string[]

我正在使用这个类来验证查询。不幸的是,它不起作用。所以我决定在我的控制器中使用@ApiImplicitQuery,如下所示:

@ApiImplicitQuery(
  name: 'status',
  enum: ['test_status_1', 'test_status_2'],
  isArray: true,
  collectionFormat: 'csv'
)

这允许我声明多选枚举,但是将这些参数添加到 url 的方式存在问题。如果我选择多个值,我会得到:

?status=test_status_1&status=test_status2

我希望使用上面指定的csv 格式发送它们。现在它使用multi 格式。有没有办法做到这一点?我做错了什么?

【问题讨论】:

关于多选的问题,我也遇到了同样的问题。由于找不到现有问题,我使用 nestjs/swagger 项目创建了问题 237。详情请查看github.com/nestjs/swagger/issues/237。 我还为您的 URL 问题创建了另一个问题,问题编号是 238,可以在 github.com/nestjs/swagger/issues/238 找到。 您找到解决方案了吗?我正在尝试使用多选枚举字段 我想这仍然没有解决? :// 【参考方案1】:

我做了这样的事情:

@ApiProperty(
        isArray: true,
        required: false,
        enum: TestCaseFiltersStatuses,
    )
    @IsOptional()
    @IsEnum(TestCaseFiltersStatuses, each: true)
    @IsArray()
    @Transform((value) => 
        if (typeof value == 'string') 
            return value.split(',')
        
        return value;
    )
    statuses?: TestCaseFiltersStatuses[];

.
.
.
async testCaseList(@Query(new ValidationPipe(transform: true)) query: TestCaseFiltersModel) 
...

这样就支持?params=1&params=2?params=1,2

【讨论】:

以上是关于NestJS Swagger - 如何声明多选枚举字段?的主要内容,如果未能解决你的问题,请参考以下文章

@nestjs/swagger:如何添加 API URL?

如何在nestjs中禁用swagger进行生产

如何使用 nestjs/swagger 更改查询参数序列化?

@nestjs/swagger:如何在没有 @ApiOkResponse 装饰器的情况下添加架构?

NRWL + NestJS 尝试使用 Swagger 插件

如何在 Nx monorepo 中为 NestJS 和 Angular 之间共享的 API 接口启用 Swagger?