【问题标题】:transform value if falsy如果为假,则转换值
【发布时间】:2020-06-06 23:25:14
【问题描述】:

我正在使用 class-validator 包验证我的 DTO。我通过

启用了转换
app.useGlobalPipes(
  new ValidationPipe({
    transform: true,
  }),
);

在我的 main.ts 文件中,如文档中所述

https://docs.nestjs.com/techniques/validation#transform-payload-objects

我的 DTO 中有一个可选配置字段。如果该字段不存在,则应将其转换为空对象。这里描述了转换装饰器

https://docs.nestjs.com/techniques/serialization#transform

我希望提出这个解决方案:

export class MyDTO {
  @IsObject()
  @IsOptional()
  @Transform(configuration => configuration || {})
  public configuration: object;
}

当我调用我的 API 路由时

@Post()
public create(@Body() myDTO: MyDTO): void {
  console.log(myDTO);
}

正文为空,所以没有字段 configuration 我的 MyDTO 实例是

{}

虽然我希望它是

{
    configuration: {}
}

出了什么问题或我错过了什么?我尝试调试代码,但它从未达到转换功能。所以@Transform 不会触发。


更新

看来我必须这样做

@IsObject()
@IsOptional()
@Transform(configuration => configuration || {}) // will be used if the field exists
public configuration: object = {}; // will be used if the field doesn't exist

如果你传入一个空的body,将使用初始值。仅当您传入该字段但为其分配一个类似 null 的值时,转换才会运行。

【问题讨论】:

    标签: nestjs class-validator class-transformer


    【解决方案1】:

    继续,把这个也放在这里:为什么不让 typescript 管理默认值,设置值如下

    export class MyDTO {
      @IsObject()
      @IsOptional()
      public configuration: object = {};
    }
    

    这样,如果你得到一个值,很好,如果它不存在,class-transform 会将正确的值放在那里。

    Looks like there is more discussion about solutions here.

    【讨论】:

    • 谢谢 :) 这适用于不存在的字段,但是当分配 null 给它时,代码会中断。我更新了我的问题以寻求解决方案,但也许可以改进
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-19
    • 2020-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多