目前,我的实体定义如下:
export class ItemEntity implements Item {
@PrimaryColumn()
@IsIn(['product', 'productVariant', 'category'])
@IsNotEmpty()
itemType: string;
@PrimaryColumn()
@IsUUID()
@IsNotEmpty()
itemId: string;
@OneToOne(() => ProductEntity, product => product.id, { nullable: true })
@JoinColumn()
@Expose({ name: 'bundleItem' })
producttItem: ProductEntity;
@OneToOne(() => ProductVariantEntity, variant => variant.id, {
nullable: true,
})
@JoinColumn()
@Expose({ name: 'bundleItem' })
variantItem: ProductVariantEntity;
@OneToOne(() => CategoryEntity, category => category.id, { nullable: true })
@JoinColumn()
@Expose({ name: 'bundleItem' })
categoryItem: CategoryEntity;
}
我添加了@Expose()
装饰器,因为我希望能够返回productItem
、variantItem
或categoryItem
中的一个,作为响应中的一个bundleItem
字段,其中任何一个都可以有一个值,但不能有两个或三个值。
但是,当我在ItemEntity的控制器上执行GET时,我想要的效果只应用于第一项,而不是其他项:
[
{
"itemType": "category",
"itemId": ""
"bundleItem": {
"categoryType": "Custom",
"description": "First custom category",
"id": "e00ad76c-95d3-4215-84b1-de17c7f1f82c",
"name": "Category A",
"updatedAt": "2023-02-24T08:49:22.913Z"
}
},
{
"itemType": "variant",
"itemId": "",
"bundletem": null
}
]
我想把效果扩展到返回数组响应中的其他项。但目前,它们是null
。本质上,我想让响应返回一个bundleItem
字段,而不管itemType
是什么类型,是productItem
,variantItem
,还是categoryItem
。我可以使用'class-transformer来实现吗?
谢谢。
1条答案
按热度按时间vltsax251#
你可以使用
@Transform
来实现这个目的,@Transform
装饰器包含了一些你可以在转换过程中使用的参数,其中之一就是对象本身。下面的示例包含一个具有两个属性的对象,如果其中一个是
null
或undefined
,则返回另一个主计长
结果是
虽然这可能有效,但我强烈建议您不要对数据库实体和DTO使用相同的类。这可能会导致各种各样的问题;现在,
ItemEntity
同时表示两个不同的概念,一个是数据库中的实体,另一个是与外部世界的契约,模型中的任何更改都会反映在API中(反之亦然)。