Dto 到实体和 dto 来自实体

24s*_*ron 6 mapping rest node.js nestjs

在我的应用程序中,我需要从实体(数据库模型)到 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;




  ....

}
Run Code Online (Sandbox Code Playgroud)

数据传输组织

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


  @ApiProperty()
  email: string;

  @ApiProperty()
  name: string;
...
}
Run Code Online (Sandbox Code Playgroud)

现在我添加静态函数toModelfromModel

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

    const {name, email,..... } = companyDto;
    companyModel.name = name;
    companyModel.email =email
   
.....
    return companyModel;
}
Run Code Online (Sandbox Code Playgroud)

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

csa*_*int 12

好吧,这取决于您还计划用 dto 做什么其他事情。在我的应用程序中,我在我的 dto-s 上进行了大量的预处理或后处理。这是一个示例,我想限制电子邮件属性的格式:

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

  @ApiProperty()
  @Transform(value => value.toLowerCase())
  email: string;

  @ApiProperty()
  name: string;
...
}
Run Code Online (Sandbox Code Playgroud)

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

static toModel(companyDto: CreateCompanyDto ): CompanyModel {
  const data = classToPlain(companyDto);
  return plainToClass(CompanyModel, data);
}
Run Code Online (Sandbox Code Playgroud)

您可以在我上面提到的链接上找到更多信息。它甚至可以帮助您了解如何控制 dto 上的属性或如何根据不同的用例更改其行为。