深入理解 GraphQL 中的错误处理

阅读时长 9 分钟读完

GraphQL 是一种用于 API 的查询语言,它可以让客户端精确地指定需要的数据,从而避免了传统 RESTful API 中的“过度获取数据”的问题。然而,与任何技术一样,GraphQL 中也有错误处理的问题,这篇文章将深入探讨 GraphQL 中的错误处理。

GraphQL 中的错误类型

GraphQL 中的错误分为两种类型:语法错误和运行时错误。

语法错误

语法错误是在解析 GraphQL 查询时发生的错误,这些错误通常是由于查询字符串中的拼写错误或语法错误引起的。GraphQL 引擎会在解析查询字符串时检测到语法错误,并返回一个错误响应。

以下是一个示例查询字符串中的语法错误:

在这个查询字符串中,phone 字段是无效的,因为该字段不存在于 User 类型中。当尝试执行此查询时,GraphQL 引擎将返回以下错误响应:

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

运行时错误

运行时错误是在执行 GraphQL 查询时发生的错误,这些错误通常是由于查询中涉及到的数据或逻辑错误引起的。GraphQL 引擎将在查询执行期间捕获这些错误,并将其转换为适当的错误响应。

以下是一个示例查询中的运行时错误:

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

在这个查询中,posts 字段是一个列表,它包含了 Post 类型的数据。假设在执行该查询时,由于某种原因,查询引擎无法从数据库中获取 Post 数据,那么将会返回以下错误响应:

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

在这个错误响应中,我们可以看到以下信息:

  • message 字段:描述错误的信息。
  • locations 字段:描述错误发生的位置。
  • path 字段:描述错误发生的路径。

处理 GraphQL 中的错误

在处理 GraphQL 中的错误时,我们需要考虑以下几个方面:

抛出异常

如果我们的查询中存在错误,我们可以抛出异常。GraphQL 引擎将捕获这些异常并将其转换为适当的错误响应。

以下是一个示例代码,其中我们在查询中抛出了一个异常:

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

如果 getUserById 函数返回 null,我们将抛出一个包含错误信息的异常。GraphQL 引擎将捕获该异常,并将其转换为以下错误响应:

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

自定义错误

有时,我们可能需要自定义 GraphQL 中的错误。我们可以使用 GraphQLError 类来创建自定义错误。

以下是一个示例代码,其中我们创建了一个自定义错误:

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

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

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

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

在这个示例代码中,我们创建了一个 UserNotFoundError 错误类,并在 resolve 函数中抛出了该错误。GraphQL 引擎将捕获该错误并将其转换为以下错误响应:

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

在这个错误响应中,我们可以看到以下信息:

  • message 字段:描述错误的信息。
  • locations 字段:描述错误发生的位置。
  • path 字段:描述错误发生的路径。
  • extensions 字段:包含自定义错误信息。

错误处理中间件

最后,我们可以使用错误处理中间件来处理 GraphQL 中的错误。错误处理中间件是一种函数,它接受错误和上下文对象作为参数,并返回一个错误响应。

以下是一个示例代码,其中我们创建了一个错误处理中间件:

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

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

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

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

在这个示例代码中,我们创建了一个错误处理中间件,并将其传递给 graphqlHTTP 函数。当发生错误时,GraphQL 引擎将调用错误处理中间件,并将错误信息传递给它。错误处理中间件将返回一个错误响应,该响应包含错误信息和自定义错误信息。

结论

在本文中,我们深入探讨了 GraphQL 中的错误处理。我们了解了 GraphQL 中的错误类型,以及如何处理 GraphQL 中的错误。我们还介绍了如何自定义 GraphQL 中的错误,并使用错误处理中间件来处理 GraphQL 中的错误。希望本文能够帮助你更好地理解和处理 GraphQL 中的错误。

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

纠错
反馈