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:
- 它 returns 只有 id 和项目作为一个整体。
@Exclude()
export class AdvisoryResultDto {
@Expose()
public id: string;
public userId: string;
public results: CalculationOutputDto[];
@Expose()
public item: Item;
}
- 此解决方案 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 中的 Expose
和 Exclude
?如果不是,我将不胜感激另一个解决方案。
为什么不创建构造函数,然后仅使用实体中所需的值来初始化 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;
}
我正在尝试将复杂的实体转换为 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,
) { }
}
我找到了一个非常适合简单实体的解决方案:
我尝试了两种可能性来定义我的 DTO:
- 它 returns 只有 id 和项目作为一个整体。
@Exclude()
export class AdvisoryResultDto {
@Expose()
public id: string;
public userId: string;
public results: CalculationOutputDto[];
@Expose()
public item: Item;
}
- 此解决方案 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 中的 Expose
和 Exclude
?如果不是,我将不胜感激另一个解决方案。
为什么不创建构造函数,然后仅使用实体中所需的值来初始化 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;
}