Nestjs:将复杂的实体转换为 Dto

Nestjs: Cast complex Entity to Dto

我正在尝试将复杂的实体转换为 Dto。我想从 DTO 中删除实体中的一些值。

我的实体看起来像这样(为简单起见,实体的很大一部分被省略):

export class ResultEntity {
    constructor(
        public id: string,
        public userId: string,
        public results: CalculationOutputEntity[] = [],
        public item: Item = new Item(),
    ) { }
}

export class Item {
    constructor(
        public privat: Private = new Private(),
        public state: State = new State(),
        public combined: number = 0,
    ) { }
}

export class State {
    constructor(
        public numberA: number = 0,
        public numberB: number = 0,
        public numberC: number = 0,
        public numberD: number = 0,
    ) { }
}

我找到了一个非常适合简单实体的解决方案: 如果我采纳自定义拦截器的这个建议,删除 id 或整个项目 属性 有效。

我尝试了两种可能性来定义我的 DTO:

  1. 它 returns 只有 id 和项目作为一个整体。
@Exclude()
export class AdvisoryResultDto {
    @Expose()
    public id: string;
    public userId: string;
    public results: CalculationOutputDto[];
    @Expose()
    public item: Item;
}
  1. 此解决方案 returns 除项目 属性 之外的所有内容。
export class AdvisoryResultDto {
    public id: string;
    public userId: string;
    public results: CalculationOutputDto[];
    @Exclude()
    public item: Item;
}

现在的问题是我只想删除项目 属性 中的某些值。因此,例如私有字段和状态 -属性 numberB.

我希望在嵌套的 classes 中也可以使用 Exclude().

删除单个值

例如:

export class AdvisoryResultDto {
    public id: string;
    public userId: string;
    public results: CalculationOutputDto[];
    public item: Item;
}

export class Item {
    @Exclude()
    public privat: PrivateDto;
    public state: StateDto;
    public combined: number;
}

export class StateDto {
    public numberA: number;
    @Exclude()
    public numberB: number;
    public numberC: number;
    public numberD: number;
}

不幸的是,我找不到关于这个确切问题的任何信息。手动接管映射也不是解决方案,因为 CalculationOutput 到目前为止要复杂得多,并且嵌套了许多 classes 和属性。

我只是错过了一小步,还是无法使用 class-transformer 中的 ExposeExclude?如果不是,我将不胜感激另一个解决方案。

为什么不创建构造函数,然后仅使用实体中所需的值来初始化 DTO?只需将实体对象传递给 DTO 构造函数并从 DTO 中删除字段。

所以我在 class-transformer 包的文档中找到了解决方案:https://github.com/typestack/class-transformer#working-with-nested-objects

我需要将 @Type-装饰器添加到嵌套的 classes

解决方法:

@Expose()
export class AdvisoryResultDto {
    public id: string;
    public userId: string;
    public results: CalculationOutputDto[];
    @Type(() => Item)
    public item: Item;
}

export class Item {
    @Exclude()
    @Type(() => PrivateDto)
    public privat: PrivateDto;
    @Expose()
    @Type(() => StateDto)
    public state: StateDto;
    public combined: number;
}

export class StateDto {
    public numberA: number;
    @Exclude()
    public numberB: number;
    public numberC: number;
    public numberD: number;
}