GraphQL:返回null vs Throwing Error

时间:2018-03-21 21:16:30

标签: graphql

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

假设我有一个类型Person

type Person {
    firstName: String!
    lastName: String!
}

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

使用可空类型,并且在找不到用户时可能返回null

type Query {
    getPerson(firstName: String!): Person
}

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

type Query {
    getPerson(firstName: String!): Person!
}

有没有正确的方法呢?

1 个答案:

答案 0 :(得分:1)

有趣的问题!

首先,我想说,响应的“错误”部分仅仅是针对开发人员错误(这意味着开发人员在后端或前端导致的错误)。对于API被滥用时发生的错误,例如提供了错误的参数(HTTP 400-403),或者内部出现了错误(HTTP 500)。在这种情况下,某些东西被破坏,用户不需要操作,而是开发人员需要操作。未找到(HTTP 404)非常特殊,因为它通常是由您的APP用户引起的(例如,您尝试访问不存在的配置文件页面)。在这种情况下,我们希望直接向用户提供反馈。 “此配置文件不存在返回主页”大多数客户端工具都无法很好地处理GraphQL错误。这就是为什么应该向用户显示的错误应该是响应模式的一部分。 This awesome blog post详细介绍了该主题。

现在我认为您不需要在API中返回专用的GetPersonPayload类型,但肯定有可能:

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

type Query {
   getPerson(firstName: String!): GetPersonPayload
}

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