乐闻世界logo
搜索文章和话题

How to transform an array in a @Query object in NestJS

3 个月前提问
3 个月前修改
浏览次数9

1个答案

1

在NestJS中,如果您想在@Query对象中处理和转换数组类型的数据,通常有一些方法可以实现这一点。这主要取决于客户端如何发送查询参数以及您想如何在服务器端接收这些参数。下面是一些具体的方法和例子:

方法1: 使用逗号分隔的值

客户端可以通过发送逗号分隔的值来发送数组,例如:?ids=1,2,3。在服务器端,您可以使用@Query装饰器来接收这个字符串并手动将其转换为数组。

typescript
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可以自动将这些值转换为数组。

typescript
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:自定义管道使用

如果您需要进行更复杂的转换或验证,您也可以创建自定义的管道来处理查询参数。

typescript
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:使用类验证器

如果您需要使用类和验证器进行更严格的数据处理,您可以使用类验证器来定义和验证输入数据。

typescript
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则提供了更强的类型检查和数据验证。

2024年8月16日 02:31 回复

你的答案