GraphQL 中的错误处理:一个深度解析

GraphQL 是一种用于 API 开发的查询语言和运行时环境。它的出现使得前端开发人员能够更加灵活地获取所需数据,而不必依赖于后端提供的固定数据结构。然而,当处理 GraphQL 查询时,错误处理可能会成为一个问题。本文将深入探讨 GraphQL 中的错误处理,并提供一些实用的指导和示例代码。

错误类型

GraphQL 定义了两种错误类型:语法错误和执行错误。语法错误是在解析查询时发生的错误,这通常意味着查询包含无效的语法。执行错误是在执行查询时发生的错误,这可能是由于查询中引用了不存在的字段或类型错误等原因。

错误处理

在 GraphQL 中,错误处理是通过将错误信息作为响应的一部分返回给客户端来完成的。这意味着在编写 GraphQL 服务器时,我们需要考虑如何返回错误信息,以便客户端能够更好地处理错误情况。

错误格式

GraphQL 规范定义了一种标准的错误格式,它包含以下字段:

  • message:错误消息。
  • locations:错误发生的位置。
  • path:引起错误的字段路径。

例如,以下是一个标准的 GraphQL 错误响应:

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

错误处理器

在 GraphQL 服务器中,我们可以使用错误处理器来捕获和处理错误。错误处理器是一个函数,它接收一个错误对象作为参数,并返回一个包含错误信息的 Promise。例如,以下是一个简单的错误处理器:

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

在 GraphQL 查询执行过程中,如果发生错误,错误处理器将被调用。我们可以在错误处理器中处理错误,例如,将错误信息记录到日志中或将错误信息发送给开发人员。

错误分类

在 GraphQL 查询执行过程中,我们可能会遇到多种类型的错误。为了更好地处理这些错误,我们可以将它们分为以下几类:

  • 服务器错误:这是由于服务器内部错误导致的错误,例如数据库连接错误或文件读取错误等。这些错误通常是无法预测的,因此我们需要使用一个通用的错误处理器来捕获和处理这些错误。
  • 参数错误:这是由于客户端提供的参数无效导致的错误,例如无效的日期格式或缺少必需的参数等。这些错误通常是可预测的,因此我们可以使用一个特定的错误处理器来处理这些错误。
  • 权限错误:这是由于客户端未经授权或没有足够的权限访问资源导致的错误。这些错误通常需要特殊的处理器来处理,以便客户端能够更好地理解错误原因。

错误处理示例

以下是一个使用 GraphQL 和 Node.js 构建的简单服务器,它演示了如何处理 GraphQL 查询中的各种错误:

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

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

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

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

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

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

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

在上面的代码中,我们定义了一个 GraphQL 查询,它包含三个字段:hellofilesecret。其中:

  • hello 字段接受一个 name 参数,并返回一个包含问候语的字符串。
  • file 字段接受一个 name 参数,并尝试读取一个名为 name 的文件。如果文件不存在或读取失败,将返回一个错误。
  • secret 字段将抛出一个 UNAUTHORIZED 错误,表示客户端未经授权访问该字段。

我们使用 customFormatErrorFn 选项将错误处理器指定为 errorHandler 函数。在错误处理器中,我们根据错误类型返回不同的错误响应:

  • 如果错误类型是 UNAUTHORIZED,则返回一个包含错误消息和错误代码的响应。
  • 如果错误类型是其他类型,则将错误记录到控制台,并返回一个通用的错误响应。

结论

GraphQL 中的错误处理是一个重要的话题。通过使用错误处理器和错误分类,我们可以更好地处理 GraphQL 查询中的错误,以便客户端能够更好地处理错误情况。希望本文能够对您理解 GraphQL 错误处理有所帮助。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/67262acb2e7021665e19a99a