Nestjs DTO 中的多种类对象验证

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

我有如下代码。但我发现当我们像这样执行“TwoWheel | FourWheel”时,@ValidateNested 不支持。此外,我无法确定传入的有效负载车辆类型是两轮还是四轮。我也需要验证这一点。我怎样才能这样做?

请注意,这些只是我创建的虚拟类。实际上,我有 3 个类,每个类都有很多领域。只有其中一些是常见的。大多数都不是。

ChatGPT 建议创建自定义验证器。但我希望 Nestjs 可以内置一些我可以使用的东西。请建议更好的方法。

提前致谢。

class TwoWheel{
    @IsNotEmpty()
    @IsNumber()
    speed: number;

    @IsNotEmpty()
    @IsString()
    color: string
}


class FourWheel{
    @IsNotEmpty()
    @IsNumber()
    speed: number;

    @IsNotEmpty()
    @IsString()
    color: string

    @IsNotEmpty()
    @IsNumber()
    numberOfSeats: number;
}

class Vehicle{
    
    @ValidateNested()
    VehicleType : TwoWheel | FourWheel
}

我尝试过的另一件事是类似的

    @IsEnum([TwoWheel, FourWheel],{
        message : "Invalid Vehicle Type"
    })
    VehicleType : TwoWheel | FourWheel

但是上面总是会返回错误信息。 至少获得@ValidateNested 对我来说也是胜利。 我需要在执行“VehicleType:TwoWheel | FourWheel”时验证嵌套字段 不想要太复杂的解决方案。只是想知道nestjs 中是否有我错过的东西。

javascript nestjs decorator dto
1个回答
0
投票

您可以使用

@Type
中的
class-transformer
注释根据特定参数手动检查输入的类型。例如

export class VehicleA {
  @IsNotEmpty()
  doors: number;
}

export class VehicleB {
  @IsNotEmpty()
  doors: number;

  @IsNotEmpty()
  seats: number;
}

export class MyDTO {

  @IsNotEmpty({
    message: "Vehicle should not be empty"
  })
  @ValidateNested({ each: true })
  @Type((options) => {
    if (options?.object && "seats" in options.object.vehicle) {
      return VehicleB;
    }

    return VehicleA;
  })
  vehicle: VehicleA | VehicleB;

}

在这种情况下,您可以使用

VehicleB
具有属性
seats
的事实,然后返回适当的类型,几乎就像类型保护器一样。

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