You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在TypeORM实体中实现对象数组字段?Swagger显示异常

问题解决:Swagger中JSON数组字段显示为['string']的修复方案

问题背景

期望返回的JSON结构:

{
  .....,
  dependants: [{name: 'john', age: 29},{name: 'doe', age: 17}]
}

现有PartnerStaff实体类:

class PartnerStaff extends BaseEntity {
  constructor(
    id: string,
    company: string,
    branch: string,
    dependants: DependantDto[],
  ) {
    super();
    this.staffId = id;
    this.company = company;
    this.branch = branch;
    this.dependants = dependants;
  }

  @PrimaryGeneratedColumn('increment')
  id!: number;

  @Column({
    unique: true,
    nullable: true,
  })
  staffId!: string;

  @Column({
    nullable: true,
    name: 'company',
  })
  company!: string;

  @Column()
  branch!: string;

  @Column('json', {nullable: true})
  dependants?: DependantDto[];
}

家属DTO类:

class DependantDto {
  @IsString()
  @IsNotEmpty({ message: 'dependant name is required' })
  readonly name!: string;

  @IsString()
  @IsNotEmpty({ message: 'dependant age is required' })
  readonly age!: number;
}

遇到的问题:Swagger中dependants字段显示为dependants: ['string'],尝试过@Column('jsonb', {nullable: true})和@Column({type: 'array', nullable: true})都无法解决。

解决方法

问题核心是Swagger无法自动推断JSON类型字段的内部结构,需要手动通过Swagger装饰器指定字段类型,同时修正DTO中的错误验证规则:

  1. 在PartnerStaff实体的dependants字段上添加Swagger装饰器,明确数组元素类型:
import { ApiPropertyOptional } from '@nestjs/swagger';

class PartnerStaff extends BaseEntity {
  // ... 其他代码

  @Column('json', {nullable: true})
  @ApiPropertyOptional({ type: [DependantDto] })
  dependants?: DependantDto[];
}
  1. 修正DependantDto中age字段的验证装饰器(原@IsString()与number类型冲突),同时添加Swagger装饰器让其结构被识别:
import { ApiProperty } from '@nestjs/swagger';
import { IsNumber, IsString, IsNotEmpty } from 'class-validator';

class DependantDto {
  @ApiProperty({ description: '家属姓名' })
  @IsString()
  @IsNotEmpty({ message: 'dependant name is required' })
  readonly name!: string;

  @ApiProperty({ description: '家属年龄' })
  @IsNumber()
  @IsNotEmpty({ message: 'dependant age is required' })
  readonly age!: number;
}

补充说明

  • 数据库字段保持json或jsonb即可,无需改成array类型——PostgreSQL的array类型仅支持单一基础类型数组,对象数组用JSON类型更适配。
  • 必须确保@nestjs/swagger已正确安装并在项目中配置。

内容的提问来源于stack exchange,提问作者PPEngineer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 02:50:38