Dto转换为实体和Dto从实体转换

6
在我的应用程序中,我需要多次将实体(数据库模型)映射到DTO(本地对象)。大多数情况下,DTO与实体具有相同的名称。例如,“The Entity”。
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的最佳解决方案是什么?
1个回答

11
好的,这取决于您计划使用DTO的其他内容。在我的应用程序中,我对我的DTO进行了大量的预处理或后处理。以下是一个示例,其中我希望限制电子邮件属性的格式:
export class Company {
  @ApiProperty()
  id: string;

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

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

如果您计划使用这些转换功能,我建议使用class-transformerclassToPlainplainToClass方法,以便您可以安全有效地将数据从dto对象转换为实体实例。 您甚至可以在两个类上放置不同的转换。
static toModel(companyDto: CreateCompanyDto ): CompanyModel {
  const data = classToPlain(companyDto);
  return plainToClass(CompanyModel, data);
}

您可以在上面提到的链接中找到更多信息。它甚至可以帮助您如何控制您的DTO属性(链接1)或如何根据不同的用例更改它们的行为(链接2)


如果我的实体有3个属性{a,b,c},而我的DTO包含2个属性{a,b},并且我编写了{const data = classToPlain(entity); return plainToClass(Dto,data);},我得到了所有3个属性{a,b,c},那么它是如何工作的呢?谢谢。 - 24sharon
你必须显式地公开属性并跳过非白名单属性。你可以在这里阅读更多信息:https://github.com/typestack/class-transformer#enforcing-type-safe-instance - csakbalint
使用 plainToClass 是在 NestJS 中使用的最佳解决方案 @24sharon - Hugo Sohm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接