万一出现错误,我总是在想是否应该返回null
或抛出错误。
假设我有一个类型 Person
:
type Person {
firstName: String!
lastName: String!
}
我想让客户端搜索特定用户。这可以通过两种方式完成:
使用可空类型并可能返回
null
当没有找到用户时:type Query {
getPerson(firstName: String!): Person
}
使用不可为空的类型并在找不到用户时抛出错误:
type Query {
getPerson(firstName: String!): Person!
}
有没有正确的方法来做到这一点?
最佳答案
有趣的问题!
首先,我想争辩说,响应的“错误”部分实际上仅适用于开发人员错误(这意味着由开发人员在后端或前端引起的错误)。对于 API 被滥用时发生的错误,例如提供了错误的参数 (HTTP 400-403),或者内部出现问题 (HTTP 500)。在这种情况下,某些东西被破坏了,用户不需要采取任何行动,而是由开发人员采取行动。 not found (HTTP 404) 非常特殊,因为它通常是由您的 APP 用户引起的(例如,您尝试访问不存在的个人资料页面)。在这种情况下,我们希望直接向用户提供反馈。 “此配置文件不存在返回主页” 大多数客户端工具不能很好地处理 GraphQL 错误。这就是为什么应该向用户显示的错误应该是您的响应模式的一部分。 This awesome blog post更详细地讨论这个话题。
现在我认为你不需要返回一个专用的 GetPersonPayload
输入您的 API,但肯定有可能:
type GetPersonPayload {
person: Person
errors: [PayloadError!]!
}
type Query {
getPerson(firstName: String!): GetPersonPayload
}
总结一下:我肯定会返回一个可为空的人,并且 - 取决于您的架构应该如何面向 future /企业 - 您甚至可能想要返回链接文章中所述的特殊有效负载类型。
关于GraphQL:返回 null 与抛出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49416650/