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

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:

  1. 修改GraphQL Schema:把updatedTask的返回类型从Boolean改成Task
type Mutation {
  updatedTask(id: ID!): Task
}
  1. 调整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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 11:12:10