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

