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

When using GraphQL/Apollo Server, should an error be thrown for no database results?

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

我会说这完全取决于您和您定义的模式。

如果您有这样的模式

type Query {
  # allow null to be returned
  user(where: FindUserInput): User
}

然后你可以 return 当没有找到用户时 null。

如果您的架构不允许 returning null,喜欢

type Query {
  # only allowed to return a valid User object
  user(where: FindUserInput): User!
}

然后抛出错误是正确的方法。

我认为没有绝对的最佳实践,更多的是关于您在项目中寻找的行为。

有理由简单地 returning null,而不是抛出错误,尤其是在这种情况下。您回复的 errors 部分将包含两种一般类型的错误:

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

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

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

type Query {
  user(username: String!): User
}

在这种情况下,有时可能无法在数据库中找到匹配的用户。只要该字段可以为空,客户端就会知道需要一个 User 或 null,并且可以很好地处理这两种情况。

如果我们抛出错误,该字段仍将 return 为空,但现在我们也会在 errors 数组中看到一个错误。客户端现在必须做额外的工作来确定错误的发生是因为没有找到用户,还是其他地方出了问题(毕竟,如果服务器发生错误,我们可能需要采取额外的行动,例如提醒用户了解事实)。此外,我们的 errors 数组不再是响应 "health" 的指标,因为它可能包含作为我们常规业务逻辑的一部分抛出的错误。