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
相关产品推荐
相关产品推荐

