Nest.js+GraphQL查询Enum报错:TraitReportType无法识别EMBEDDED值
解决Nest.js + GraphQL中Enum类型匹配报错问题
问题根因
报错Enum "TraitReportType" cannot represent value: "EMBEDDED"的核心原因是大小写不匹配:
- 数据库存储的
type值为大写字符串"EMBEDDED" - 你的
TraitReportType枚举中,EMBEDDED对应的实际值是小写字符串"embedded"
GraphQL对枚举值的字符串匹配严格区分大小写,因此出现类型解析失败。
解决方案
方案1:同步枚举值与数据库存储格式
直接修改枚举定义,让枚举成员对应的值和数据库存储的大写字符串一致:
import { registerEnumType } from '@nestjs/graphql'; export enum TraitReportType { LAYOUT = 'LAYOUT', EMBEDDED = 'EMBEDDED', } registerEnumType(TraitReportType, { name: 'TraitReportType', description: '报告类型枚举', });
方案2:数据映射时转换大小写(不修改枚举定义)
如果不想调整枚举的定义,可以在数据从数据库取出后、返回给GraphQL前,将type字段转换为小写:
方式A:实体类中通过getter处理(以TypeORM为例)
import { Column } from 'typeorm'; import { Expose, IsDefined, IsEnum } from 'class-validator'; import { ApiProperty, Field } from '@nestjs/graphql'; import { TraitReportType } from './trait-report-type.enum'; export class Report { // 其他字段... @Column({ name: 'type' }) private _type: string; @Expose() @IsDefined() @IsEnum(TraitReportType) @ApiProperty({ enum: TraitReportType }) @Field(() => TraitReportType, { nullable: false }) get type(): TraitReportType { return this._type.toLowerCase() as TraitReportType; } set type(value: TraitReportType) { this._type = value; } }
方式B:Resolver层处理返回数据
async entity(@Args('id') id: ID!) { const entity = await this.entityService.findOne(id); // 遍历reports转换type大小写 entity.reports = entity.reports.map(report => ({ ...report, type: report.type.toLowerCase() })); return entity; }
验证
修改完成后重启服务,执行原查询语句:
query EntityReportsQuery($id: ID!) { entity(id: $id) { id secondaryId reports { key name description icon { type component name size source } type layout url } } }
此时数据库返回的"EMBEDDED"会被正确解析为枚举类型,不再报错。
内容的提问来源于stack exchange,提问作者Usman
相关产品推荐
相关产品推荐

