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

Posted

技术标签:

【中文标题】如何使用 nestjs/swagger 更改查询参数序列化?【英文标题】:How to change query parameters serialization using nestjs/swagger? 【发布时间】:2020-05-28 00:51:29 【问题描述】:

最近我将项目中的nestjs/swagger 包更新为^4.0.0。之前 Swagger 将我的查询参数序列化如下:

/resources?parameter=1,2,3

现在看起来像这样:

/resources?parameter=1&parameter=2&parameter=3

我的查询的 DTO 对象如下所示:

class QueryDTO 
  @ApiProperty(
    required: false,
    type: [Number],
  )
  @IsOptional()
  readonly parameter?: number[];

如何改变这种行为?

【问题讨论】:

【参考方案1】:

作为一种解决方法,您可以从 DTO 中删除 @ApiProperty 并在具有样式和分解选项的控制器方法上使用 @ApiQuery 装饰器(只需保持与 dto 属性相同的参数名称)

    @Get('resources')
    @ApiQuery(name: 'parameter', required: false, explode: false, type: Number, isArray: true)
    getResources(@Query('parameter') parameter?: number[]) 

您仍然可以将 DTO 对象原样用于其他按常规方式工作的参数。

【讨论】:

【参考方案2】:

我在 Nestjs/swagger 4.5.9

我通过定义 DTO 使其工作(注意 format: 'form'

  @IsNotEmpty()
  @ApiProperty(
    type: [Number],
    format: 'form',
  )
  @IsArray()
  @Transform((value: string) => value.split(',').map(item => Number(item)))
  @IsNumber(, each: true)
  deviceId: Array<number>;

【讨论】:

以上是关于如何使用 nestjs/swagger 更改查询参数序列化?的主要内容,如果未能解决你的问题,请参考以下文章

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

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

NRWL + NestJS 尝试使用 Swagger 插件

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

@nestjs/swagger 没有设置授权标头

@nestjs/swagger:是不是可以防止网络钓鱼?