How to transform an array in a @Query object in NestJS
在NestJS中,如果您想在@Query对象中处理和转换数组类型的数据,通常有一些方法可以实现这一点。这主要取决于客户端如何发送查询参数以及您想如何在服务器端接收这些参数。下面是一些具体的方法和例子:方法1: 使用逗号分隔的值客户端可以通过发送逗号分隔的值来发送数组,例如:?ids=1,2,3。在服务器端,您可以使用@Query装饰器来接收这个字符串并手动将其转换为数组。import { Controller, Get, Query } from '@nestjs/common';@Controller('items')export class ItemsController { @Get() findAll(@Query('ids') ids: string): string[] { const idsArray = ids.split(',').map(id => parseInt(id, 10)); return idsArray; // [1, 2, 3] }}方法2:直接使用数组格式客户端可以直接发送数组格式,例如:?ids[]=1&ids[]=2&ids[]=3。NestJS可以自动将这些值转换为数组。import { Controller, Get, Query } from '@nestjs/common';@Controller('items')export class ItemsController { @Get() findAll(@Query('ids') ids: number[]): number[] { return ids; // [1, 2, 3] }}方法3:自定义管道使用如果您需要进行更复杂的转换或验证,您也可以创建自定义的管道来处理查询参数。import { PipeTransform, Injectable, ArgumentMetadata } from '@nestjs/common';@Injectable()export class ParseIntArrayPipe implements PipeTransform { transform(value: string, metadata: ArgumentMetadata): number[] { return value.split(',').map(val => parseInt(val, 10)); }}@Controller('items')export class ItemsController { @Get() findAll(@Query('ids', ParseIntArrayPipe) ids: number[]): number[] { return ids; // [1, 2, 3] }}方法4:使用类验证器如果您需要使用类和验证器进行更严格的数据处理,您可以使用类验证器来定义和验证输入数据。import { Type } from 'class-transformer';import { IsArray, IsNumber, ValidateNested } from 'class-validator';class IdsDto { @IsArray() @IsNumber({}, { each: true }) @Type(() => Number) ids: number[];}@Controller('items')export class ItemsController { @Get() findAll(@Query() query: IdsDto): number[] { return query.ids; // [1, 2, 3] }}这些方法可以根据您的具体需求选择使用。每种方法都有其优势,例如,方法1和3允许您在没有额外依赖的情况下进行简单的转换和验证,而方法4则提供了更强的类型检查和数据验证。