You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NestJS Swagger单参数无法转为字符串数组问题求助

解决NestJS Swagger单参数转数组问题

针对Swagger UI传递单个数组参数时控制器收到字符串而非数组的问题,提供三种可行方案:

方案1:配置Swagger ApiQuery参数格式

在控制器方法上通过@ApiQuery指定参数的style和explode属性,让Swagger UI以多参数形式渲染数组输入,确保后台解析为数组:

import { Controller, Get, Query } from '@nestjs/common';
import { ApiQuery, ApiTags } from '@nestjs/swagger';
import { List } from './dto/list.dto';

@ApiTags('list')
@Controller('list')
export class ListController {
  @Get()
  @ApiQuery({
    name: 'categories',
    type: String,
    isArray: true,
    required: false,
    style: 'form',
    explode: true, // 启用后Swagger UI会生成多个同名字段输入框
  })
  getList(@Query() query: List) {
    return query;
  }
}

方案2:自定义参数转换管道

创建管道统一处理单个字符串转数组的逻辑,可全局或局部使用:

// parse-array.pipe.ts
import { PipeTransform, Injectable, ArgumentMetadata } from '@nestjs/common';

@Injectable()
export class ParseArrayPipe implements PipeTransform {
  transform(value: any, metadata: ArgumentMetadata) {
    // 仅处理query参数中的单个字符串
    if (metadata.type === 'query' && typeof value === 'string') {
      return [value];
    }
    return value;
  }
}

控制器中使用:

@Get()
getList(@Query(new ParseArrayPipe()) query: List) {
  return query;
}

方案3:在DTO中通过class-transformer处理

利用class-transformer的@Transform装饰器,在DTO层自动转换单个字符串为数组:

import { ApiProperty } from '@nestjs/swagger';
import { IsOptional } from 'class-validator';
import { Transform } from 'class-transformer';

export class List {
  @ApiProperty({ isArray: true, type: String, required: false })
  @IsOptional()
  @Transform(({ value }) => typeof value === 'string' ? [value] : value)
  public categories?: string[];
}

以上三种方案均可实现:传递单个参数时控制器接收['25']数组,传递多个参数时接收['25','21']数组。

内容的提问来源于stack exchange,提问作者Maksym Shafarenko

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 16:01:47