Nestjs swagger 带有一个参数的字符串数组

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

当我只发送一个参数时,我得到的查询结果像字符串,而不是像字符串[]。这仅来自 UI swagger,如果我从 Postman 发送 - 它效果很好。

我只想从 swagger-ui 发送一个参数并得到字符串数组,而不是字符串

我该如何修复它?请帮助我。

示例1:发送一个参数,在我的控制器中我得到像“25”这样的字符串

示例2:当我在控制器中发送2个参数时,我可以看到字符串数组('25','21')

export class List {
  @ApiProperty({ isArray: true, type: String, required: false })
  @IsOptional()
  public categories?: string[];
}
swagger nestjs swagger-ui
3个回答
3
投票

当您填写单个类别时,查询参数将被转换为字符串,而当您填写多个类别时,查询参数将被翻译为数组。

为了解决这个问题我在DTO中添加了:

@Transform(({ value }) => (Array.isArray(value) ? value : Array(value)))

我强制演员阵容


1
投票

您应该尝试将您的参数分散在服务中的 const 中 编辑:

我不知道如何用正式的语言解释,但是对于JAVASCRIPT来说,一个项目的字符串数组似乎与一个字符串值是相同的。

因为数组不是类型,而是类型的一种形式....

因此,如果您在控制器中,在对其进行任何操作之前,请重新声明为:

    @Get(":id")
    findManybyId(@Param("id") id: string[]) {
        const idArray = [...id];
        return await this.service.findManyById(idArray);
    }

它将解决你关于数组的问题


旧答案:

您应该尝试更改您制作输入装饰器的控制器。

就你而言,我不知道你是否使用ID来获取,但你必须按照示例进行操作:

   @ApiOperation({
       summary: "Get many categories by ID",
   })
   async getMany(
       @Param("id") ids: string[],
   ) {
       return await this.categoriesService.getMany(id);
   }

0
投票

我跟你有同样的问题。

我决定创建一个名为 toArray 的 utils 转换。

代码:

    export function ToArray(): (target: any, key: string) => void {
    return Transform((params: TransformFnParams) => {
          const { value } = params;

          if (Array.isArray(value)) {
              return value;
           }

          if (typeof value === 'string') {
              return value.split(',').map(item => item.trim());
          }
       
          return [];
         });
      } 

所以当我需要转换时,我只需要导入ToArray任何需要转换为Array的地方。

    @ApiProperty({ description: 'List of category IDs', example: ['47b32970-4997-4364-91b6-4b5533941307', '620b7c84-6d63-492e-8abb-7606e04a375c'], required: false })
    @ToArray()
    @IsArray()
    categories?: string[];
© www.soinside.com 2019 - 2024. All rights reserved.