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 表