如何在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中的错误验证规则:
- 在
PartnerStaff实体的dependants字段上添加Swagger装饰器,明确数组元素类型:
import { ApiPropertyOptional } from '@nestjs/swagger'; class PartnerStaff extends BaseEntity { // ... 其他代码 @Column('json', {nullable: true}) @ApiPropertyOptional({ type: [DependantDto] }) dependants?: DependantDto[]; }
- 修正
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
相关产品推荐
相关产品推荐

