【问题标题】:Class transformer not converting to array of numbers类转换器未转换为数字数组
【发布时间】:2021-02-06 05:04:33
【问题描述】:

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

export class EvseGetQueryDto {
  ...
  ...

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

  ...
  ...
}

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

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

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

http://localhost:3000/evses?locations[]=1&locations[]=2

谁能指导我?

【问题讨论】:

    标签: typescript nestjs class-validator class-transformer


    【解决方案1】:

    查询参数总是以字符串形式出现,如果您使用 URL 参数也是如此。 @Type(() =&gt; Number) 足以修改它,但您需要确保在 ValidationPipe 中设置了 transform: true

    import {  Type } from 'class-transformer';
    import { IsArray, IsNumber } from 'class-validator';
    
    export class NumbersQuery {
      @Type(() => Number)
      @IsArray()
      @IsNumber({}, {each: true})
      numbers: number[];
    }
    
    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;
      }
    }
    
    ▶ curl http://localhost:3000/numbers/\?numbers\[\]\=1\&numbers\[\]\=2
    [1,2]%  
    
    [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 ] }
    

    【讨论】:

    • 非常感谢杰!在您解释了这些内容后,我发现了问题。我的控制器中缺少验证管道。
    猜你喜欢
    • 2016-04-11
    • 2012-12-06
    • 2020-11-22
    • 2014-12-19
    • 1970-01-01
    • 1970-01-01
    • 2022-10-13
    • 2014-08-08
    • 2017-11-10
    相关资源
    最近更新 更多