GraphQL传ID至React更新Task遇400错误及字段选择问题
问题原因分析
你遇到的错误核心是前端GraphQL请求对返回类型为Boolean的updatedTask字段添加了子字段选择,但Boolean类型本身没有任何子字段,所以GraphQL服务器报错。
结合你说后端通过Apollo测试正常,说明后端的Schema和resolver逻辑是没问题的——大概率后端定义的updatedTask mutation返回值是Boolean(表示操作成功/失败),但前端却像请求Task对象一样去获取它的id、done这类子字段。
两种解决方案
方案1:前端修改mutation请求(适配现有后端)
如果后端就是要返回布尔值,那把前端mutation里updatedTask的子字段删掉,只保留字段名即可。
错误的前端mutation示例:
mutation ToggleTaskDone($id: ID!) { updatedTask(id: $id) { id done } }
修改后的正确版本:
mutation ToggleTaskDone($id: ID!) { updatedTask(id: $id) }
这样请求后,服务器会返回布尔值,前端直接判断这个值就知道操作是否成功。
方案2:后端修改返回类型(返回更新后的Task)
如果你需要前端拿到更新后的Task数据,那要调整后端的Schema和resolver:
- 修改GraphQL Schema:把
updatedTask的返回类型从Boolean改成Task
type Mutation { updatedTask(id: ID!): Task }
- 调整resolver逻辑:找到对应ID的Task,切换
done状态后,返回这个Task对象(而不是只返回true/false)
比如resolver代码示例(假设用JS/TS):
updatedTask: async (_, { id }, { db }) => { const task = await db.Task.findById(id); if (!task) throw new Error("Task not found"); task.done = !task.done; await task.save(); return task; // 返回完整的Task对象,而不是布尔值 }
这时候前端原来的mutation请求(带id、done子字段)就可以正常工作了。
内容的提问来源于stack exchange,提问作者anfield
相关产品推荐
相关产品推荐

