如果出现错误,我总是想知道是否应该返回null
或抛出错误。
假设我有一个类型Person
:
type Person {
firstName: String!
lastName: String!
}
我想让客户端搜索特定用户。这可以通过两种方式完成:
使用可空类型,并且在找不到用户时可能返回null
:
type Query {
getPerson(firstName: String!): Person
}
使用非可空类型并在找不到用户时抛出错误:
type Query {
getPerson(firstName: String!): Person!
}
有没有正确的方法呢?
答案 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
}
总结一下:我肯定会返回一个可以为空的人 - 并且 - 取决于你的架构应该如何防范/企业 - 你甚至可能想要返回一个特殊的有效负载类型,如链接文章中所述。