NestJS:类验证器不会抛出强制转换对象的验证错误

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

从示例代码开始:

// anniversarycredits.dto.ts

export class AnniversaryCreditsDto {
  @IsNumber()
  @ApiProperty({
    description: 'The amount of credits to award on anniversary.',
  })
  'creditAmount': number;

  @IsString()
  @IsOptional()
  @ApiProperty({ description: 'The name (appearance only) of this benefit.' })
  'name': string;

  @IsString()
  @IsOptional()
  @ApiProperty({
    description: 'The description of this benefit (appearance only).',
  })
  'description': string;

  @Equals('ANNIVERSARY_CREDITS')
  @IsOptional()
  @ApiProperty({
    description: 'This is an internal identifier, leave default.',
  })
  'type' = 'ANNIVERSARY_CREDITS';
}
// benefits.controller.ts (snippet)

@Patch()
  update(
    @Req() req: any,
    @Body()
    updateBenefitData: any,
  ): Promise<ResponseDto> {
    switch (updateBenefitData.type) {
      case 'ANNIVERSARY_CREDITS':
        return this.benefitsService.update(
          req._merchantId,
          updateBenefitData as AnniversaryCreditsDto,
        );

如您所见,我在要投射到的 dto 上设置了类验证器标签。类验证器适用于除我正在转换的情况之外的所有其他情况。在转换时,它不会抛出任何错误并允许任何输入。

我尝试四处寻找答案,似乎找不到遇到同样问题的人。我研究了构造所有对象而不是强制转换的可能性,但使用

new
构造时,验证器似乎并未运行。欢迎任何意见,谢谢。

javascript nestjs dto class-validator
1个回答
0
投票

class-validator,顾名思义,适用于类实例。 Nest 通过巧妙地使用参数元数据反射及其使用 class-transformer 获取传入对象并将其转换为类实例的 ValidationPipe,使其“看似”适用于常规对象。

然后
实例有validate(来自类验证器)调用,并且
实例
读取其属性元数据,以便可以正确验证每个属性。 正如您在这里所做的那样,转换只是告诉编译器“看,我知道这个变量就是这个值,相信我”。它没有运行时意义,此时您拥有的只是一个对象。同样,当您使用

any

类型作为

@Body()
参数时,
ValidaitonPipe
会查看元数据并“不知道这是什么”并直接返回值,因为没有实例可以故意将其转换为 for验证。
如果您需要继续使用这种 

any

方法,1)考虑使用

unknown
代替,2)将对象转换为
AnniversaryCreditsDto
的实例,然后
然后
使用 validate
class-validator
到根据你的装饰看看物品是否有错误。
    

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