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

NestJS GraphQL代码优先模式定义实体时自定义对象数组字段报错

NestJS GraphQL代码优先模式自定义对象数组字段报错解决

问题场景

使用NestJS结合GraphQL代码优先模式开发时,在实体类FormAnswerTaskData中添加自定义对象数组字段values前程序运行正常,添加该字段后触发以下错误:

Error: Cannot determine a GraphQL output type for the "values". Make sure your class is decorated with an appropriate decorator.

相关代码:

@InputType('FormAnswerTaskDataInput')
@ObjectType()
export class FormAnswerTaskData extends BaseTaskData {
  @Field()
  id: string;

  @Field((type) => Int)
  order: number;

  @Field()
  title: string;

  @Field()
  widget: string;

  @Field((type) => Boolean)
  required: boolean;

  @Field((type) => [FormDataValue], { nullable: 'itemsAndList' })
  values: FormDataValue[];
}

@InputType()
class FormDataValue {
  @Field()
  value: string;
}

错误原因

FormAnswerTaskData同时被@InputType和@ObjectType装饰,说明它既作为GraphQL的输入类型,也作为输出类型。但嵌套的FormDataValue仅添加了@InputType装饰器,当FormAnswerTaskData作为输出类型时,GraphQL无法识别values字段对应的输出类型,因此抛出错误。

解决方案

方案1:让嵌套类同时支持输入和输出类型

给FormDataValue同时添加@ObjectType()装饰器,使其适配两种类型场景:

@InputType()
@ObjectType()
class FormDataValue {
  @Field()
  value: string;
}

方案2:严格拆分输入/输出类型(复杂场景推荐)

如果需要明确区分输入和输出逻辑,可以拆分出两个独立的类:

// 输入专用类型
@InputType()
class FormDataValueInput {
  @Field()
  value: string;
}

// 输出专用类型
@ObjectType()
class FormDataValue {
  @Field()
  value: string;
}

// 在主类中分别指定对应类型
@InputType('FormAnswerTaskDataInput')
@ObjectType()
export class FormAnswerTaskData extends BaseTaskData {
  // ...其他字段

  @Field((type) => [FormDataValue], { nullable: 'itemsAndList' })
  @InputField((type) => [FormDataValueInput], { nullable: 'itemsAndList' })
  values: FormDataValue[];
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 05:24:17