GraphQL 是现代应用程序的API查询语言,它通过类型化的查询语法获取数据。 GraphQL 提供了非常好的可扩展性,但是错误处理往往被忽略。错误处理是所有应用程序的重要组成部分,因此在实施 GraphQL 调用时要考虑错误处理最佳实践。
GraphQL 错误类型
在 GraphQL 中,有两种类型的错误:
- 语法错误:这些错误在查询中发现。 GraphQL 不支持的查询语法可能导致语法错误。
- 运行时错误:这些错误发生在查询解析和验证后的执行阶段。 例如,查询无法满足模式或无法满足引用数据。
1. 明确标识错误
GraphQL 打破了 REST API 的传统响应模型,其中成功操作和错误操作都以 200 错误码返回,这使得难以通过错误码确定操作结果。在 GraphQL 中,我们可以使用自定义类型表示错误并标识出有效的响应。
以下示例演示了 GraphQL 查询中使用错误类型:
---- ----- - -------- ----- ----------- - ---- ---------- - -------- -------- ----- ---- ------ ------ - ---- ---- - --- --- ----- ------ ---- --- -
我们可以使用 UserResult
类型来返回 User
或错误。如果查询成功,则设置 UserResult.success = true
并将用户对象设置为 UserResult.user
。如果查询失败,则设置 UserResult.success = false
并将错误消息设置为 UserResult.error
。
2. 记录错误
与其他应用程序一样,重要的一点是记录错误。 GraphQL 查询也不例外。 在 GraphQL API 响应中添加错误信息,以便开发人员可以从日志中轻松确定错误。
GraphQL 有两种方法记录错误:logs
和 monitors
。
- 日志记录:将错误消息写入日志文件中,以便稍后进行分析和处理。
- 监视器:可以使用各种监视器工具,例如 Prometheus、Newrelic 和 Grafana。这些工具可以帮助我们监控查询性能并报告任何错误。
以下示例演示了记录错误的方法:
----- - ------------------ -------------- - - ------------------- ----- --------- - --- ------------------- ----- ------------ ------------ ------------ ------- -- -- -- ----- - ----- ----------------------------- -- -------- - ----- ----------------------------- -- ---------- - ----- ----------------------------- -- ---------- - ----- ----------------------------- -- -- --- -------------- - ----------
在以上示例中,ErrorType
根据需求定义了查询时返回错误的具体信息。
3. 显示友好的错误信息
GraphQL API 遵循客户端驱动的设计,这意味着 GraphQL API 必须针对客户端要求做出响应。 因此,错误处理应该始终从最终用户的角度考虑。 友好的错误信息可以帮助前端开发人员查找错误并有效地解决问题。
以下示例演示了如何在 Node.js 中捕获并返回友好的错误信息:
----- - ------- - - ------------------- -- ---------- ----- ------------ - -------------------------- ------------------- ----- ---- -- - --------------- --------- ----- ---- -------------- -- - ----------------------------- -- -------------- -- - ------------------- ---- ----- --- ---
总结
GraphQL 是一种强大的API查询语言,错误处理是 GraphQL 支持的一项强大功能。实现 GraphQL 错误处理最佳实践需要记录错误信息、明确标识错误、并提供友好的错误信息。 错误处理越简单,代码中的 bug 就越少。 然后,在应用程序中实现正确的错误处理将大大提高用户体验。
来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/6471b6a9968c7c53b0f9780a