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

GraphQL中PlannerInput.tasks类型错误的解决方法

问题:GraphQL输入类型错误:PlannerInput.tasks必须为输入类型

开发规划器后端时,定义PlannerInput将tasks设为[Task],终端报错:

Error: The type of PlannerInput.tasks must be Input Type but got: [Task]

原TypeDefinition.js关键代码片段

const {gql} = require('apollo-server-express')

const typeDefs = gql`
  type Planner{
    id: ID
    tasks: [Task]
    dayDescription: String
    waterGlassCount: String
  }
  type Task{
    id: ID
    taskDescription: String
    shouldStrike: Boolean
  }
  input TaskInput{
    taskDescription: String
    shouldStrike: Boolean
  }
  input PlannerInput{
    tasks: [Task] # 此处触发错误
    dayDescription: String
    waterGlassCount: String
  }
  # 其余Query、Mutation定义省略
`;
module.exports=typeDefs;

错误原因

GraphQL严格区分输出类型(type关键字定义)和输入类型(input关键字定义):

  • Task是输出类型,仅用于向客户端返回数据
  • 接口的输入参数(如Mutation的入参)必须使用输入类型,不能直接引用输出类型

解决方案

1. 修正TypeDefinition.js中的PlannerInput

将PlannerInput里的tasks类型替换为输入类型数组[TaskInput]:

input PlannerInput{
  tasks: [TaskInput] # 替换为输入类型数组
  dayDescription: String
  waterGlassCount: String
}

2. 调整Resolver逻辑,正确处理tasks数据

修改createPlanner和updatePlanner的Resolver,确保能接收并存储tasks:

// Resolvers.js 中Mutation部分修改
Mutation:{
  createPlanner: async(parent, args, context, info)=>{
    const { tasks, dayDescription, waterGlassCount} = args.planner
    const planner = new Planner({ tasks, dayDescription, waterGlassCount})
    await planner.save()
    return planner
  },
  updatePlanner: async(parent, args, context, info)=>{
    const {id}= args;
    const {tasks, dayDescription, waterGlassCount} = args.planner;
    const updates ={};
    if(tasks !== undefined){
      updates.tasks = tasks
    }
    if(dayDescription!== undefined){
      updates.dayDescription = dayDescription
    }
    if(waterGlassCount !== undefined){
      updates.waterGlassCount = waterGlassCount
    }
    // 注意添加await,否则返回的是Query对象而非实际文档
    const planner = await Planner.findByIdAndUpdate(id, updates, {new:true});
    return planner
  },
  # 其余Mutation逻辑省略
}

3. 优化Mongoose模型(可选,提升数据规范性)

当前PlannerModel的tasks字段为普通Array,建议改为嵌入TaskSchema或关联Task模型:

// PlannerModel.js 修改
const mongoose = require("mongoose");
const TaskSchema = require('./TasksModel').schema; // 导入Task的Schema

const PlannerSchema = new mongoose.Schema({
  // 方案1:嵌入TaskSchema,适合小型关联数据
  tasks: [TaskSchema],
  // 方案2:关联独立Task模型(如需单独管理Task)
  // tasks: [{ type: mongoose.Schema.Types.ObjectId, ref: 'task' }],
  dayDescription: {
    type: String,
  },
  waterGlassCount: {
    type: String,
  },
});

const Planner = mongoose.model("planner", PlannerSchema);
module.exports = Planner;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 10:18:18