类转换器未转换为数字数组

pan*_*o89 2 typescript class-validator nestjs class-transformer

我有一个 DTO,其中有一个字段,它是一个数字数组。这些 id 来自 API 查询参数。我正在使用 Class Transformer 将这些 id 转换为数字数组。但我只得到一个字符串数组。我的 DTO 课程如下。

export class EvseGetQueryDto {
  ...
  ...

  @IsOptional()
  @IsArray()
  @IsNumber({}, {each: true})
  @ApiProperty({ type: [Number] })
  @Type(() => Number)
  locations?: number[];

  ...
  ...
}
Run Code Online (Sandbox Code Playgroud)

我的控制器代码如下所示。

async GetAll(@Query() query: EvseGetQueryDto): Promise<EvseDto[]> {
    return await this.evseService.GetAll(query);
}
Run Code Online (Sandbox Code Playgroud)

如果我像下面这样调用我的控制器,我仍然['1', '2']在我的位置字段中。

http://localhost:3000/evses?locations[]=1&locations[]=2
Run Code Online (Sandbox Code Playgroud)

任何人都可以指导我吗?

Jay*_*iel 13

Query parameters always come in as strings, as do URL parameters if you use those. The @Type(() => Number) is enough to modify this though, but you need to make sure you have transform: true set in your ValidationPipe.

import {  Type } from 'class-transformer';
import { IsArray, IsNumber } from 'class-validator';

export class NumbersQuery {
  @Type(() => Number)
  @IsArray()
  @IsNumber({}, {each: true})
  numbers: number[];
}
Run Code Online (Sandbox Code Playgroud)
import { Controller, Get, Query, UsePipes, ValidationPipe } from '@nestjs/common';
import { AppService } from './app.service';
import { NumbersQuery } from './numbers';

@Controller()
export class AppController {
  constructor(private readonly appService: AppService) {}

  @Get()
  getHello(@Query() query: Record<string, unknown>): string {
    return this.appService.getHello(query);
  }

  @UsePipes(new ValidationPipe({ transform: true }))
  @Get('numbers')
  getNumbers(@Query() numbers: NumbersQuery) {
    console.log(numbers);
    return numbers.numbers;
  }
}
Run Code Online (Sandbox Code Playgroud)
? curl http://localhost:3000/numbers/\?numbers\[\]\=1\&numbers\[\]\=2
[1,2]%  
Run Code Online (Sandbox Code Playgroud)
[Nest] 76497   - 10/23/2020, 10:40:47 AM   [NestFactory] Starting Nest application...
[Nest] 76497   - 10/23/2020, 10:40:47 AM   [InstanceLoader] AppModule dependencies initialized +11ms
[Nest] 76497   - 10/23/2020, 10:40:47 AM   [RoutesResolver] AppController {}: +5ms
[Nest] 76497   - 10/23/2020, 10:40:47 AM   [RouterExplorer] Mapped {, GET} route +2ms
[Nest] 76497   - 10/23/2020, 10:40:47 AM   [RouterExplorer] Mapped {/numbers, GET} route +1ms
[Nest] 76497   - 10/23/2020, 10:40:47 AM   [NestApplication] Nest application successfully started +1ms
NumbersQuery { numbers: [ 1, 2 ] }
Run Code Online (Sandbox Code Playgroud)


DDD*_*DDD 5

如果您不喜欢您的搜索查询看起来像

/evses?locations[]=1&locations[]=2
Run Code Online (Sandbox Code Playgroud)

并想要传递整个列表之类的东西

/evses?locations=1,1
Run Code Online (Sandbox Code Playgroud)

在你的班级中使用

export class yourclass {


    @Transform(({ value }) => value.toString().split(',').map(Number))
    locations:Number[];

}
Run Code Online (Sandbox Code Playgroud)