[...] 不更改状态码,仅通过错误字段确定是标准方式吗?
YES 不使用状态码管理错误,它们与 Http 相关并且 GraphQL 旨在与协议/框架无关,因此您需要的一切都应该在输出中。
正如你所说,你的回复中可以有一个errors 字段:
响应中的错误条目是一个非空错误列表,其中每个错误都是一个映射。
如果在请求的操作过程中没有遇到错误,则错误条目不应出现在结果中。
规范规定errors 字段条目可以有一个名为extensions 的字段:
GraphQL 服务可能会通过键扩展提供额外的错误条目。此条目(如果设置)必须有一个映射作为其值。此条目是为实现者保留的,可以在他们认为合适的情况下向错误添加其他信息,并且对其内容没有额外的限制。
使用extensions 字段,您可以将自定义机器可读信息添加到您的错误中,例如此处的关键代码。
{
"errors": [
{
"message": "Name for character with ID 1002 could not be fetched.",
"locations": [ { "line": 6, "column": 7 } ],
"path": [ "hero", "heroFriends", 1, "name" ],
"extensions": {
"code": "CAN_NOT_FETCH_BY_ID",
"timestamp": "Fri Feb 9 14:33:09 UTC 2018"
}
}
]
}
阿波罗预言
为了使错误管理更容易,我创建了一个 codegen CLI,它为服务器生成可抛出的错误类并促进客户端的错误处理。
https://github.com/theGlenn/apollo-prophecy