typescript - Nest.js + TypeORM + OpenApi 中虚拟(计算)列的最佳实践

标签 typescript swagger nestjs openapi typeorm

我有一个实体(图像),它具有这样的计算属性(图像路径):

@Entity()
export class Image extends BaseEntity {
  @PrimaryGeneratedColumn()
  @IsInt()
  id: number

  @Column({ type: 'varchar', length: 255, unique: true })
  @IsString()
  @IsNotEmpty()
  uid: string

  protected mainPath: string

  @AfterLoad()
  @AfterInsert()
  @AfterUpdate()
  generateMainPath(): void {
    this.mainPath = Math.floor(this.id / 10000) + '/' + Math.floor(this.id / 100) + '/' + this.uid
  }
}

我在后端文件系统中使用mainPath来存储图片,同时也将其发送到前端构建img src路径。 mainPath 成功生成并发送给客户端。

问题是前端使用 swagger (nswag openapi2tsclient) 生成的 typescript 文件建立在 openApi 模式之上,由 Nest.JS 生成。生成的文件中没有 IImage 接口(interface)的 mainPath 属性。是否可以以某种方式声明它以便在客户端定义它并填充来自 ajax 响应的提供值?

附注 1。试图用 @ApiProperty({ type: String }) 装饰 mainPath - 它没有帮助。

附注 2。尝试使用 @Column({ type: virtual }) 但后端会发出警告,指出 MySQL 不支持此类型。

附注 3。似乎 mainPath 应该在前端声明为一些通常的非计算属性,因为它会预先填充来自后端的数据(它不会在前端计算) .

附注 4。可能的方法似乎是对数据库和 ExtendedImage 类使用裸模型,该类具有在构造函数中计算的 mainPath 属性(如果未提供)。这是最佳做法吗?

最佳答案

通过使用 class-validator 中的一些装饰器,我能够得到我想要的东西。我不知道为什么会这样:

@Entity()
export class Image extends BaseEntity {
  @PrimaryGeneratedColumn()
  @IsInt()
  id: number

  @Column({ type: 'varchar', length: 255, unique: true })
  @IsString()
  @IsNotEmpty()
  uid: string

  @IsString()
  @IsOptional()
  protected mainPath: string

  @AfterLoad()
  @AfterInsert()
  @AfterUpdate()
  generateMainPath(): void {
    this.mainPath = Math.floor(this.id / 10000) + '/' + Math.floor(this.id / 100) + '/' + this.uid
  }

关于typescript - Nest.js + TypeORM + OpenApi 中虚拟(计算)列的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64985390/

相关文章:

api - 如何 Swagger 引用一个响应对象?

Nestjs全局缓存: CacheInterceptor problem

authentication - 如何使用 JWT token 管理多设备同时登录?

javascript - 通过连接两个数组创建新数组

html - 如何对齐列表元素之间的空间

jetty - Swagger 的 Restesty 3 + Jetty 9.2 + JAX-RS 3

java - 使用 responseContainer Swagger 注释属性标记非平面容器

javascript - 如何通过在 typescript 中调用函数来关闭bootstrap 4模式

typescript - VS Code Intellisense 非常慢

node.js - AWS Lambda 上的 Nestjs(无服务器框架)|如何访问事件参数?