GraphQL:返回 null 与抛出错误

标签 graphql

万一出现错误,我总是在想是否应该返回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/

相关文章:

graphql - 使用 GraphQL 查询获取最大值和最小值

javascript - 如何在现有 GraphQL 服务器上添加根和查看器查询以支持中继

typescript - 如何从 GraphQL 模式生成 GraphQL 操作

node.js - Apollo GraphQL "Cannot return null for non-nullable field Mutation.createUser"

postgresql - Hasura继承角色权限不一致

GraphQl/Sequelize 在单个列表中组合多个 hasMany/BelongsToMany

typescript - item 没有类型注释,在其自己的初始化程序中直接或间接引用

reactjs - 在 Gatsby 上,如何使用 prop 进行 GraphQL 查询?

reactjs - 是否安全地在客户端创建带有 token 的 cookie?

graphql - 在Python Graphene中使用模式中不同的类型执行嵌套查询