12

如何转换数据库实体User

class User {
  public firstName: string;
  public lastName: string;
  public phone?: string;
  public email: string;
  public status: EUserState;
  public tokens: Token[];
  public password: string;
}

进入 DTO 实体GetUserDTO

class GetUserDTO {
  public id: number;
  public firstName: string;
  public lastName: string;
  public phone?: string;
  public email: string;
}

在打字稿中?我正在使用@nestjs,class-validatorclass-transformer包,但我没有找到任何方法来使用它们来实现这一点。

有人可能会说,拥有 DTO 对此毫无意义,但我们在服务器和客户端之间共享 DTO 以维护 API 结构。

有任何想法吗?

4

2 回答 2

19

有几种方法可以实现您想要的

  1. 您可以手动从Domain模型映射到DTOsusingstaticDomainDTO
export class Domain {
   ...
   static toDTO(domain: Domain) {
      // mapping goes here
   }
}

或者

export class Dto {
   ...
   static fromDomain(domain: Domain) {
      // mapping goes here
   }
}
  1. 您可以使用 3rd 方库:automapper-ts, @wufe/mapper, @nartc/automapper(my lib), 或morphism

class-transformer也可以被认为是一个映射器,但是,如果你想从一个模型映射到另一个模型,那么class-transformer就不能真正做到这一点。

于 2020-02-10T01:58:54.047 回答
0

首先,使用 class-transformer 的 classToPlain 将 Entity 更改为纯 json

然后,使用下面的 class-transformer 的 plainToClass 将纯 json 更改为 DTO

  public async getAll(): Promise<ItemDTO[]> {
    return await this.repo.find()
      .then(items => items.map(e=>plainToClass(ItemDTO, classToPlain(e), { excludeExtraneousValues: true })));
  }

另外,让我们在 DTO 中使用 Exclude、Expose of class-transformer 来获取您希望客户端看到的客户端数据。

@Exclude()
export class ItemDTO implements Readonly<ItemDTO> {
  @ApiProperty({ required: true })
  @IsUUID()
  @Expose()
  id: string;
}
于 2020-03-23T15:16:10.947 回答