GraphQL:返回 null 与抛出错误

Eya*_*l C 10 graphql

如果出现错误,我总是想知道我应该返回null还是抛出错误。

假设我有一个类型Person

type Person {
    firstName: String!
    lastName: String!
}
Run Code Online (Sandbox Code Playgroud)

我想让客户端搜索特定用户。这可以通过两种方式完成:

使用可空类型并可能null在未找到用户时返回:

type Query {
    getPerson(firstName: String!): Person
}
Run Code Online (Sandbox Code Playgroud)

使用不可为空的类型并在找不到用户时抛出错误:

type Query {
    getPerson(firstName: String!): Person!
}
Run Code Online (Sandbox Code Playgroud)

有没有正确的方法来做到这一点?

Her*_*rku 5

有趣的问题!

首先,我想争辩说,响应的“错误”部分实际上仅适用于开发人员错误(这意味着由开发人员在后端或前端引起的错误)。对于 API 被滥用时发生的错误,例如提供了错误的参数 (HTTP 400-403),或内部出现问题 (HTTP 500)。在这种情况下,某些东西被破坏了,用户不需要采取任何行动,而是由开发人员采取行动。not found (HTTP 404) 非常特殊,因为它通常是由您的 APP 用户引起的(例如,您尝试访问不存在的个人资料页面)。在这种情况下,我们希望直接向用户提供反馈。“此个人资料不存在返回主页" 大多数客户端工具都不能很好地处理 GraphQL 错误。这就是为什么应该向用户显示的错误应该成为响应模式的一部分。这篇很棒的博客文章详细介绍了这个主题。

现在我不认为你需要GetPersonPayload在你的 API 中返回一个专用类型,但它肯定是一种可能性:

type GetPersonPayload {
  person: Person
  errors: [PayloadError!]!
}

type Query {
   getPerson(firstName: String!): GetPersonPayload
}
Run Code Online (Sandbox Code Playgroud)

总结一下:我肯定会返回一个可为空的人,并且 - 取决于您的架构应该如何面向未来/企业 - 您甚至可能想要返回链接文章中所述的特殊有效负载类型。