GraphQL 的错误处理非常有特色,因为它允许部分成功。
典型响应长这样:
{
"data": {
"resident": {
"id": "r-1001",
"name": "林岚",
"tickets": [
{
"id": "t-501",
"title": "空调异响",
"device": null
}
]
}
},
"errors": [
{
"message": "设备 d-404 不存在",
"path": ["resident", "tickets", 0, "device"]
}
]
}这表示:
- 整张问询单不是全挂
- 大部分数据拿到了
- 只是某个具体字段出错
- 所以
data和errors可以同时存在
你要区分三类问题:
请求错误 比如语法错、字段名不存在、变量类型不匹配
这种错误通常在执行前就被拦下,往往没有data字段执行错误 比如某个 resolver 抛错、非空字段却返回了
null
这种情况常见于执行中,可能有部分data网络/HTTP 错误 比如超时、反向代理失败、请求头不对
一张总记忆图:
语法/校验错
-> 没开始办理
-> 通常只有 errors
某个字段办理失败
-> 已部分办理
-> data + errors
网络层失败
-> 总台都没接到或没回出来
-> 由 HTTP/客户端错误处理负责实践里还要多记一件事:
400常见于解析或校验错误- 某些 GraphQL 响应即使带
errors,HTTP 也可能仍是200/2xx - 因为“HTTP 成功”不等于“每个字段都成功”
所以前端处理 GraphQL,不能只看 HTTP 状态码,还要看响应体里的 errors。