【问题标题】:Dto to entity and dto from entityDto 到实体和 dto 从实体
【发布时间】:2021-06-16 19:39:17
【问题描述】:

在我的应用中,我需要从实体(数据库模型)到 DTO(本地对象)的多次映射

大多数时候,D 与实体同名

例如实体

export class CompanyModel extends BaseEntity {
  constructor(init?: Partial<CompanyModel>) {
  }
  @PrimaryGeneratedColumn('uuid')
  id: string;

  @Column({ length: 500 })
  name: string;

  @Column({ length: 500, unique: true })
  email: string;




  ....

}

DTO

export class Company {
  @ApiProperty()
  id: string;


  @ApiProperty()
  email: string;

  @ApiProperty()
  name: string;
...
}

现在我添加静态函数toModelfromModel

  static toModel(companyDto :CreateCompanyDto ) : CompanyModel {
    const companyModel =  new CompanyModel();

    const {name, email,..... } = companyDto;
    companyModel.name = name;
    companyModel.email =email
   
.....
    return companyModel;
}

在nestjs / node中将DTO映射到ENTITY的最佳解决方案是什么

【问题讨论】:

    标签: node.js rest mapping nestjs


    【解决方案1】:

    嗯,这取决于您对 dto 的其他计划。在我的应用程序中,我在我的 dto-s 上进行了很多预处理或后处理。这是一个示例,我想限制电子邮件属性的格式:

    export class Company {
      @ApiProperty()
      id: string;
    
      @ApiProperty()
      @Transform(value => value.toLowerCase())
      email: string;
    
      @ApiProperty()
      name: string;
    ...
    }
    

    如果您打算使用这些转换,我建议使用class-transformer:classToPlainplainToClass 方法,这样您就可以安全有效地将数据从 dto 对象转换为实体实例。您甚至可以对两个类进行不同的转换。

    static toModel(companyDto: CreateCompanyDto ): CompanyModel {
      const data = classToPlain(companyDto);
      return plainToClass(CompanyModel, data);
    }
    

    您可以在我上面提到的链接上找到更多信息。它甚至可以帮助您,如何在您的 dto 上 control the properties 或如何根据不同的用例 change their behaviour

    【讨论】:

    • 如果我的实体有 3 个属性 {a,b,c},并且我的 dto 包含 2 个属性 {a,b},我写了 {const data = classToPlain(entity);返回plainToClass(Dto,数据);我得到了所有 3 个属性 {a,b,c},那么它是如何工作的呢?谢谢
    • 您必须明确公开属性并跳过非白名单属性。你可以在这里阅读更多:github.com/typestack/…
    • 使用 plainToClass 是在 NestJS @24sharon 中使用的最佳解决方案
    【解决方案2】:

    AutoMapper 呢?我使用这个库将实体映射到 DTO,但反过来也可以。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-07-23
      • 2011-08-20
      • 2021-10-28
      • 2018-09-13
      • 1970-01-01
      • 1970-01-01
      • 2017-09-17
      相关资源
      最近更新 更多