NestJS 嵌套对象作为查询参数 + OpenApi 文档

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

我使用 NestJS 作为后端,我的用例如下: 我希望将嵌套对象作为查询参数来过滤日期,但可能在多个字段上进行过滤。

网址示例 =

GET /contents?createdBy=1&createdAt[startDate]=1234&createdAt[endDate]=1235&updatedAt[startDate]=5678&updatedAt[endDate]=5679

这会产生这样的对象:

{
  createdBy: 1;
  createdAt: {
    startDate: 1234;
    endDate: 1235
  };
  updatedAt: {
    startDate: 5678;
    endDate: 5679;
  }
}

以下是我目前的类型:

export default class DateFiltersInput {
  @ApiProperty({ required: false })
  @IsNumber()
  @Expose()
  @IsOptional()
  startDate?: number | undefined;

  @ApiProperty({ required: false })
  @IsNumber()
  @IsOptional()
  endDate?: number | undefined;
}


export default class GetContentsQuery {
  @ApiProperty({ required: false })
  @IsNumber()
  @IsOptional()
  createdBy?: number

  @ApiProperty({ required: false, type: DateFiltersInput })
  @IsOptional()
  @Type(() => DateFiltersInput)
  @ValidateNested()
  createdAt?: DateFiltersInput;

  @ApiProperty({ required: false, type: DateFiltersInput })
  @IsOptional()
  @Type(() => DateFiltersInput)
  @ValidateNested()
  updatedAt?: DateFiltersInput;
}

但这就是我在 Swagger 中得到的

我想要在 NestJS 中实现的目标是否可能?

nestjs query-string
1个回答
0
投票

从技术上讲,查询字符串就是一个字符串。因此 Swagger 始终将其表示为文本输入。如果您想传递对象结构,则必须使用请求的

body
,并且由于这是一个
GET
请求,我认为您不会这样做。 因此,您可以如何将过滤器作为查询字符串传递。

  /**Fetch a list of content records.*/
  @ApiQuery({
    name: 'filter',
    description: 'Filter json object',
  })
  public async getContents(
    @Query('filter') filter?: string,
  ): Promise<GetContentsResponseDto> {
    const filterDto = filter ? JSON.parse(filter) : null;
    return this.contentService.getContents(filterDto);
  }

将查询字符串作为字符串化(JSON.stringify)对象传递,并在控制器中进行 JSON.parse 。在 Swagger 中,您仍然会获得文本输入,但我使用一个网站:https://onlinejsontools.com/stringify-json,它可以帮助我快速对我复制并粘贴到 Swagger 中的对象进行字符串化,以快速测试我的端点。

© www.soinside.com 2019 - 2024. All rights reserved.