NestJS > TypeORM 将复杂实体映射到复杂 DTO

Posted

技术标签:

【中文标题】NestJS > TypeORM 将复杂实体映射到复杂 DTO【英文标题】:NestJS > TypeORM Mapping complex entities to complex DTOs 【发布时间】:2020-08-05 04:27:48 【问题描述】:

我正在使用 class-transformer > plainToClass(entity, DTO) 将实体映射到 DTO

我还实现了 here 中描述的关联 transform.interceptor 模式。

然后我在我的 DTO 成员上使用@Expose()。这很好用,但我有一个限制,我需要在我的父 DTO 中映射成员 DTO,这没有发生,请参见下面的简单示例

@Exclude()
export class ParentDTO

  @Expose()
  pMember2 : string;

  @Expose()
  pMember2 : ChildDto[];


@Exclude()
export class ChildDTO

  @Expose()
  cMember2 : string;


export class ParentEntity
  pMember1 : number;
  pMember2 : string;
  pMember3 : string;
  pMember4
 : Child[];


export class ChildEntity
  cMember1 : number;
  cMember2 : string;
  cMember3 : string;

现在,如果我运行 plainToClass(parentEntityFromDB, ParentDTO),我希望得到以下结果

ParentDTO
  pMember2 : string;
  pMember2 : ChildDto[];

然而,我得到的是

ParentDTO
  pMember2 : string;
  pMember2 : Child[]; //Including all original members

基本上 plainToClass(entity, DTO) 不会自动映射成员以匹配给定的 DTO 类型。

有没有办法做到这一点,或者这是方法的限制??

谢谢

【问题讨论】:

【参考方案1】:

你必须用@Type指定嵌套类型:

@Exclude()
export class ParentDTO

  @Expose()
  pMember2 : string;

  @Expose()
  @Type(() => ChildDto)
  pMember2 : ChildDto[];

使用@Type 装饰器,当调用plainToClass 时,class-transformer 会为给定属性实例化一个类。否则,嵌套属性将保持一个普通的 javascript 对象,因此您的 @Exclude 将不会被使用。

【讨论】:

完美,谢谢!

以上是关于NestJS > TypeORM 将复杂实体映射到复杂 DTO的主要内容,如果未能解决你的问题,请参考以下文章

将 TypeORM 实体模型类与 NestJS-GraphQL 模式类型结合使用好吗?

使用 NestJS、TypeORM、GraphQL 更新具有实体之间关系的 PSQL 表

NestJS typeorm - 无法创建实体

如何从控制器 JSON 返回的实体字段中排除。 NestJS + Typeorm

如何在带有typeorm的nestjs项目中使用外部实体?

NestJS 中的 TypeORM - 如何在实体中获取 MySQL 嵌套对象并对子关系进行“位置”查询?