GraphQL 是一种新兴的 API 查询语言,由 Facebook 开发。它提供了更高效、更灵活、更强大的数据查询能力,以及对前端应用的更好支持。例如,可以通过 GraphQL 查询返回一个对象的子 Set,而不是整个对象,以提高速度和可用性。
然而,在 GraphQL 操作中,服务端出现错误是一件常见的事情,因此必要了解 GraphQL 服务端错误类型、出现的原因以及针对这些错误进行的适当处理。
服务端错误类型
出现 GraphQL 服务端错误时,GraphQL 有两类错误类型:可处理和不可处理。
可处理错误
在 GraphQL 查询调用时可能会出现可处理错误。例如,当客户端请求一个不存在的字段,或者提供无效参数时,GraphQL 会返回一个有效的错误响应,帮助客户端排除问题或进行必要的更正。
不可处理错误
GraphQL 还可能遇到不可处理错误,例如连接数据库失败或网络错误等等,这些错误通常是插件/组件/库层面的问题。当这些错误发生时,GraphQL 不会向客户端返回错误结果。这时,需要日志记录以便于追踪问题。
GraphQL 服务端错误原因
GraphQL, 服务端错误通常是由以下问题引起的:
- 数据库连接失败
- 数据库查询失败
- 网络错误
- 逻辑错误,例如以下两种可能的错误:
- 未经授权的操作
- 查询处理器逻辑错误
相应的错误处理方法
在对 GraphQL 的服务端错误进行处理时,需要对不可处理错误和可处理错误分别采取不同的方法。
不可处理错误
对于不可处理错误,需要记录日志并通知系统管理员。通常,这样做可以帮助系统管理员更好地了解系统的状况和问题,并及时地进行解决和优化。
以下是一种可能的记录日志的方式:
------------------- ----- ------------- ---- ----- - --- - ----- ------------- ------- ------- --------- ---- ------- ---- ------ - ----- ------- - --------------------- ---------------- ------------------------ -------- ------ --------- ---- ------- ----- ---- - ---
请注意,以上日志记录示例代码仅为参考,具体的日志记录方法可以根据您的实际情况进行更改。
可处理错误
对于可处理错误,GraphQL 提供了一种特别的方式,即向客户端返回有效的错误响应。 GraphQL 将查询解析/编译成 AST 后,会对查询使 AST 节点进行验证,进而将错误转化为 GraphQL 提供的标准错误对象,具体响应信息包括:query
, locations
和 message
.
例如,如果客户端请求属性 email
但服务端数据库中没有这个属性,那么 GraphQL 会返回类似于以下的错误响应:
- --------- - - ---------- ------- ----- ----- --------- -- ---- ----------- ------------ -- ------- -- --------- - -- - - -
可以根据需要返回其他类型的错误。通过自定义错误处理方法,您可以将 GraphQL 的自定义错误转化为自己的错误格式,这里以 'MyError' 为例:
------------------- ----- ------------- ---- ----- - --- - ----- ------------- ------- ------- --------- ---- ------- ---- ------ - ----- ------- - --------------------- ---------------- ------------------------ -------- ------ --------- ---- ------- ----- ---- ------- - ---------------------- -------- ----- ----- ----- ------- ------ - -------------- -- -- -------- ---------- ----- --------- --- - -- --- ---
以上是自定义错误处理代码的示例,如有需要,可以根据自己的业务场景进行扩展。
结论
在互联网发展的时代,GraphQL 的发展也呈现了可喜的趋势。发生 GraphQL 服务端错误是很常见的事情,但您可以从上述信息中了解 GraphQL 服务端错误的化解方法,这样就能提高应用程序的质量及可靠性,使它变得更强壮。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/673457d90bc820c582488144