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

时间:2020-04-22 08:12:15

标签: node.js typescript nestjs typeorm class-transformer

我正在使用class-transformer> plainToClass(实体,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 个答案:

答案 0 :(得分:1)

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

@Exclude()
export class ParentDTO{

  @Expose()
  pMember2 : string;

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

使用@Type装饰器,类转换器在调用plainToClass时为给定属性实例化一个类。否则,嵌套属性将保留为纯JavaScript对象,因此不会使用您的@Exclude