当我只发送一个参数时,我得到的查询结果像字符串,而不是像字符串[]。这仅来自 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[];
}
当您填写单个类别时,查询参数将被转换为字符串,而当您填写多个类别时,查询参数将被翻译为数组。
为了解决这个问题我在DTO中添加了:
@Transform(({ value }) => (Array.isArray(value) ? value : Array(value)))
我强制演员阵容
您应该尝试将您的参数分散在服务中的 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);
}
我跟你有同样的问题。
我决定创建一个名为 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[];