Apollo Server执行addTask突变报非空字段不可返回null错误
错误根因与修复方案
1. 核心问题:返回值与schema定义不匹配
你在schema中声明addTask突变的返回类型为Task!(非空Task对象),但当前resolver中map操作返回的是整个lists数组(元素为List类型对象),GraphQL解析时无法从数组中匹配到Task类型的name字段,就会触发非空字段返回null的报错。
2. 次要问题:入参与测试数据不匹配
你的测试数据中列表ID为list-0、list-1,但测试突变时传入的listId是task-0,无法匹配到任何列表,自然无法生成新的Task对象。
3. 隐藏问题:未修改原数据数组
你仅用map生成了新数组,没有赋值给原lists变量,后续查询时数据不会更新,修改操作无法持久化。
修正后的resolver代码
addTask(parent, {listId, name}) { // 匹配目标列表 const targetList = lists.find(list => list.id === listId); if (!targetList) { throw new Error(`ID为${listId}的列表不存在`); } // 生成新Task对象 const newTask = { name, completed: false, // 可替换为你自己的ID生成逻辑 id: "task-" + Date.now() }; // 更新原数组数据 targetList.tasks.push(newTask); // 按schema要求返回Task对象 return newTask; }
额外问题解答
不需要提前将tasks和lists分开存储,你当前的嵌套数据结构完全可以满足基础功能需求,等后续数据量变大、关联查询场景增多时再考虑拆分存储即可。测试时记得把突变的listId参数替换为已存在的list-0或list-1即可正常运行。
内容的提问来源于stack exchange,提问作者Zamoule
相关产品推荐
相关产品推荐

