NestJS & TypeORM:发布请求中的 DTO 格式

Posted

技术标签:

【中文标题】NestJS & TypeORM:发布请求中的 DTO 格式【英文标题】:NestJS & TypeORM: DTO format in post request 【发布时间】:2019-11-12 07:25:22 【问题描述】:

我的应用中有这些实体。

类别.ts

export class Category 
    @PrimaryGeneratedColumn()
    Id: number

    @Column()
    Name: string

    @OneToMany(type => SubCategory, subcategoy => subcategoy.Category)
    SubCategories: SubCategory[];

子类别.ts

export class SubCategory 
    @PrimaryGeneratedColumn()
    Id: number

    @Column()
    Name: string

    @ManyToOne(type => Category, category => category.SubCategories)
    @JoinColumn(name: "CategoryId")
    Category: Category;

现在,如果我想添加一个新的子类别,我的 DTO 格式应该是什么样的?我尝试了以下但外键(CategoryId)为NULL。

SubCategoryDto.ts

export class SubCategoryDto 
    Id: number;
    Name: string;
    CategoryId: number;

我了解为什么 CategoryId 列的值在数据库中为空,因为 CategoryId 尝试转换为 Category,但由于两者属于不同类型而失败。我可以执行以下操作,但我觉得这只会使请求数据变大(即使有点)

export class SubCategoryDto 
    Id: number;
    Name: string;
    Category: CategoryDto; //has the properties of Id and Name

那么 SubCategoryDto 的格式应该是什么?我是否需要通过首先从数据库中获取类别然后创建 SubCategory 实体来将 DTO 转换为实体类?例如:

//request data for new sub-category

    Name: "Subcategory 1",
    CategoryId: 1

在服务器端

const newSubcategory    = new SubCategory(); //entity class
newSubcategory.Name     = subCategoryDto.Name;
newSubcategory.Category = await this.categoryService.findById(subCategoryDto.CategoryId)
await this.subCategoryService.create(newSubcategory);

但是,如果我这样做,不是需要额外的数据库调用吗?处理这种情况的最佳方法是什么?我整天在互联网上搜索,找不到与此相关的东西。我想这是一件简单的事情,没有人需要问,但不幸的是,我不确定应该如何处理。任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

您需要在 SubCategory 实体中添加 CategoryId 属性以允许映射 DTO 和实体:

export class SubCategory 
@PrimaryGeneratedColumn()
Id: number

@Column()
Name: string

@Column()
CategoryId: number

@ManyToOne(type => Category, category => category.SubCategories)
@JoinColumn(name: "CategoryId")
Category: Category;

TypeORM 自动生成该列,但没有“手动”声明,DTO 的字段 CategoryId 尝试在类别实体中转换并失败。

【讨论】:

以上是关于NestJS & TypeORM:发布请求中的 DTO 格式的主要内容,如果未能解决你的问题,请参考以下文章

找不到模块'@nestjs/typeorm'

在 Nestjs 中注入 Tree Typeorm 存储库

TypeError:存储库方法不是函数(NestJS / TypeORM)

过滤从查询参数传递的数组。 NestJS,TypeORM

NestJS + TypeORM 中的 JoinTable 问题

播种时NestJS中的TypeOrm:RepositoryNotFoundError