使用 GraphQL/Apollo Server 时,是否应该为没有数据库结果而抛出错误?

Caz*_*tor 5 arrays graphql apollo-server

例如,如果解析器从数据库中获取用户并且没有找到用户,是否应该抛出错误?找不到数据的最佳做法是什么?

Dan*_*den 5

有一种情况是简单地返回null,而不是抛出错误,特别是在这种情况下。errors您的回复部分将包含两种常见类型的错误:

  • 执行过程中遇到的抛出错误或被拒绝的 Promise 导致的执行错误
  • 由于响应不符合架构而导致的响应验证错误

在这两种情况下,服务器端都发生了一些不好的意外的事情。作为客户,我可能需要提交缺陷、提出问题或对 3 个隔间之外的人大喊大叫。但重点是,这些错误在正常情况下不应该发生。

另一方面,让我们考虑通过用户名或其他标识符来查找用户。我们假设我们使用的是精确匹配并且仅返回单个用户,而不是返回用户数组的搜索。

type Query {
  user(username: String!): User
}
Run Code Online (Sandbox Code Playgroud)

在这样的场景中,有时在数据库中找不到匹配的用户可能是预料之中的。只要该字段可以为空,客户端就会知道期望是用户还是空,并且可以很好地处理这两种情况。

如果我们抛出一个错误,该字段仍将返回 null,但现在我们还会在errors数组中看到一个错误。客户端现在必须做额外的工作来确定错误是否是因为找不到用户而发生,或者是否出现其他问题(毕竟,如果发生服务器错误,我们可能需要采取额外的操作,例如向服务器发出警报)用户以事实为准)。此外,我们的errors数组不再是响应“健康”的指示器,因为它可能包含作为我们常规业务逻辑的一部分抛出的错误。