如何一起使用 ParseIntPipe 和 Dto?

问题描述 投票:0回答:3

从查询中我得到限制参数。 如何转成数字并通过Dto检查?

  @Get('currency/:type')
  getCurrency(
    @Param() params: CurrencyTypeDto,
    @Query('limit', ParseIntPipe) limit: number,
    @Query() query: PaginationLimitDto
  ) {

分页限制

export class PaginationLimitDto {
    @IsOptional()
    @IsInt()
    limit: number;
}
nestjs dto
3个回答
9
投票

查询和 URL 参数始终作为字符串对象出现,只是底层引擎如何处理它们。您可以使用 DTO 添加

@Transform()
装饰器并执行类似

的操作
export class PaginationLimitDto {
  @IsOptional()
  @IsInt()
  // pre 0.3.2 syntax
  @Transform(val => Number.parseInt(val))
  // after 0.3.2 syntax*
  @Transform({ value } => Number.parseInt(value))
  limit: number;
}

那么你只需要在方法处理程序中使用

@Query() query: PaginationLimitDto
。 Nest 的
ValidationPipe
会为您拨打
class-transformer
class-validator

*请参阅 Github 上的 变更日志


5
投票

@Transorm
装饰器的更新语法。

import { Transform } from 'class-transformer';

export class Photo {
  id: number;

  @Transform(({ value }) => parseInt(value))
  index: number;
}

0
投票

您还可以在 main.ts 中使用全局管道,自动将任何原始数据类型解析为所需的数据类型。这将影响每个带有装饰器的 DTO 以及 @Param 或 @Query

  app.useGlobalPipes(new ValidationPipe({
    transform: true
  }))

希望它对某人有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.