如何在 GraphQL 中有效地处理错误

阅读时长 8 分钟读完

GraphQL 是一种用于 Web 应用程序的查询语言。它允许客户端指定它需要的数据,从而减少了额外的请求和响应。然而,在实际开发中,错误(包括查询错误、服务器错误和网络错误)不可避免。本文将介绍如何在 GraphQL 中有效地处理错误。

GraphQL 错误

GraphQL 服务通常通过一个单一的“入口点”(即,一个特定的 URL)来提供查询。当客户端发出查询请求时,服务可能会返回一个以上的错误。

GraphQL 中的错误主要分为两类:

  • 访问级别错误,例如验证错误。
  • 运行时错误,例如尝试访问无效的字段。

GraphQL 规范定义了一种特殊类型的错误称为 GraphQL errors,这种错误具有以下结构:

-- -------------------- ---- -------
-
  -
    ---------- -------
    ------------ -
      -
        ------- ---
        --------- -
      -
    --
    ------- ------- ------
  -
-

GraphQL 服务器错误

GraphQL 服务器错误通常是由于程序错误(例如,访问未定义的变量)而导致的。在这种情况下,GraphQL 规范定义了一种特殊的错误类型 GraphqlServerError,该错误具有以下结构:

-- -------------------- ---- -------
-
  ---------- -------
  ------------ -
    -
      ------- ---
      --------- -
    -
  --
  ------- ------- -------
  ------------- -
    ------- ------------
  -
-

GraphQL 规范定义了 8 个错误码,以及它们表示的错误类型。这些错误码可以在规范的 Errors 文档 中找到。

当遇到 GraphQL 服务器错误时,以下是一些应该做的事情。

1. 避免返回敏感信息

在任何情况下,GraphQL 服务器都不应返回敏感信息,例如安全令牌或数据库凭据。如果你的 GraphQL 服务器抛出了敏感信息,建议使用日志记录,以确定您的系统是否存在安全漏洞。

2. 返回有用的信息

尽可能返回有用的信息,例如可维护性信息、错误代码和错误信息。这是一个好的设计实践,尤其是当客户端无法访问服务器源代码时。

3. 返回状态码以支持故障排除

在客户端提交 GraphQL 查询时,GraphQL 服务器应该使用 HTTP 状态码来指示查询的成功或失败。例如,使用 400 状态码表示无效查询,使用 500 状态码表示未处理的服务器错误。

客户端错误处理

GraphQL 语法是相对宽松的,但是在运行时或请求到达 GraphQL 服务器之前,GraphQL 执行器会执行一些验证操作。如果请求无效,则 GraphQL 执行器会生成错误信息。处理 GraphQL 客户端错误时,以下是一些应该做的事情。

1. 解析错误消息

GraphQL 服务器错误消息包含位置信息、路径信息和错误消息。客户端可以解析位置信息以确定 GraphQL 查询中的错误。 错误路径指明了具有错误的字段。错误消息应该足够易懂,以便为前端开发人员提供调试信息。

一种常见的做法是定义一个错误状态对象,该对象包含标准的 HTTP 状态码,以及错误描述信息。

在客户端代码中,可以使用转换器函数将 GraphQL 错误转换为错误状态对象。

-- -------------------- ---- -------
------ -------- --------------------------------- -
  ----- ----- - -
    -------- -------
  --

  -- -------------- -- ------------------------- -
    ------ ------
  -

  ----- ------------ - -------------

  -- --------- ------- ----- ---- ----- ------
  ------ ----------------- -
    ---- -----------------
      ------------- - ---- ---- --------
      ---------- - ----
      ------
    ---- ------------------
      ------------- - --------------- -------- -- ------ ---- -----------
      ---------- - ----
      ------
    ---- ------------
      ------------- - ------------- ----------- -- ------ ---- -----------
      ---------- - ----
      ------
    ---- --------------------
      ------------- - ----------- ---------
      ---------- - ----
      ------
    ---- ------------------------
      ------------- - -- ------ ----- --- -----------
      ---------- - ----
      ------
    --------
      ------------- - ------------------ -- --------------
      ---------- - --------------- -- ----
      ------
  -

  ------ ------
-

2. 处理网络错误

GraphQL 查询是基于 HTTP 协议的,因此可能会发生网络错误。例如,在客户端和服务器之间的连接期间发生中断。为了处理网络错误,可以使用 Ajax 库,例如 axiosfetch

以下是一个使用 axios 库的示例代码:

-- -------------------- ---- -------
----- ----- - -----------------

-----
  ----------------- -
    ------ -
      ----- -
        -- -
          --------
          -----
        -
      -
    --
  --
  ---------------- -- -
    --------------------- ---------------- ---------------
  --
  -------------- -- -
    ------------------ ---------------
  ---

3. 显示错误消息

当发生 GraphQL 客户端错误时,应该向用户显示错误消息。为了保持用户体验良好并避免用户混乱,错误消息应该足够明确并指导用户采取正确的行动。如果可能,错误消息应该通过文本,图标或背景颜色而不是弹出窗口来获取用户的注意。

以下是一个在 React 组件中使用 错误状态对象 来显示错误消息的示例代码:

-- -------------------- ---- -------
------ ------ ----------- --------- ---- --------
------ --------------------- ---- -----------------

-------- --------- -
  ----- --------- ----------- - ----------------
  ----- ------- --------- - ---------------
  ----- ------ -------- - ---------------

  ------------ -- -
    -----------------

    ----- ----- - -
      ----- -
        -- -
          --------
          -----
        -
      -
    --

    ---
      -------------
      ------------ -- -
        --------------
      --
      --------------------- -- -
        --------------------------------------------
      --
      ----------- -- -
        ------------------
      ---
  -- ----

  -- --------- -
    ------ ----------------------
  -

  -- ------- -
    ------ ----------- ----------------------
  -

  ------ -
    -----
      -------------- ---------------------
      ----------- ------------------
    ------
  --
-

------ ------- --------

结论

在本文中,我们介绍了如何在 GraphQL 中有效地处理错误,包括 GraphQL 错误、GraphQL 服务器错误和客户端错误。我们还提供了代码示例,以供参考。

在设计 GraphQL 服务器时,你应该考虑定义错误规范和命名约定,以便客户端可以更好地处理 GraphQL 错误。尽可能的提供有用和友好的错误信息,这将有助于开发人员更快地发现和解决问题。最后,当出现错误时,不要将错误信息暴露给客户端,这将有助于确保您的系统更加安全。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67527e1c8bd460d3ad94d7fb

纠错
反馈