为 GraphQL 编写错误处理中间件

GraphQL 是一种流行的查询语言,用于构建 API 和查询前端应用程序所需的数据。在 GraphQL API 中,一个常见的问题是如何处理错误,以便在前端应用程序中显示有意义的错误信息。本文将介绍如何为 GraphQL 编写错误处理中间件,以便在 GraphQL API 中捕获和处理错误。

GraphQL 错误处理的挑战

在传统的 REST API 中,我们通常使用 HTTP 错误代码来指示错误类型。但在 GraphQL 中,对于每个查询,返回的都是包含数据和错误信息的同一响应格式。这意味着我们需要以一种特殊的方式来处理和回应 GraphQL 错误,以确保前端应用程序能够理解并正确地显示错误信息。

例如,在以下的示例 GraphQL 查询中:

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

如果在查询中出现错误,例如无法从数据库中找到用户,将返回错误响应,如下所示:

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

在这个响应中,errors 数组包含了一个带有错误信息的对象。这个对象具有 message 字段,指示查询中发生了什么错误,并且还有 locations 和 path 等属性,可帮助我们定位错误位置。

但是,如果您要为每次查询手动编写错误处理程序,该怎么办呢?这显然会导致代码重复和工作量增加的问题。因此,我们需要一种可重用且易于维护的错误处理方案。

编写 GraphQL 错误处理中间件

Middleware 是一个通用的概念,在许多不同的编程环境中都有用到。在 GraphQL API 中,我们可以使用类似的方式为其编写中间件。

GraphQL 中的中间件是一个被 GraphQL 服务器调用的函数,它可以在执行查询之前或之后对其进行修改或处理。

下面是一个返回错误的 GraphQL 解析器示例:

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

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

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

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

这个解析器执行了一个会抛出错误的查询。如果您在 GraphQL Playground 等工具中运行这个查询,将会看到以下输出:

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

我们可以看到,GraphQL 返回的结果中包含了错误信息,并标识了错误的位置。

接下来,让我们尝试为 GraphQL 编写一个错误处理中间件。在这个中间件中,我们将首先捕获 GraphQL 查询中发生的错误,并将其转换为我们指定的错误格式。

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

在这个中间件中,我们使用了一个名为 errorHandler 的异步函数,接收从 GraphQL 服务器传递的解析器中的五个参数。如果查询执行过程中抛出错误,我们将其包装成一个包含错误信息的对象,并将其放置到 errors 数组中。最后,我们将处理后的响应返回给 GraphQL 服务器。

现在,我们需要将 errorHandler 中间件应用于我们的 GraphQL 解析器。我们可以使用 Apollo Server 中的 applyMiddleware 函数来完成这个任务。

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

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

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

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

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

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

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

在这里,我们使用了 Apollo Server 的 applyMiddleware 函数,将 errorHandler 中间件应用到了我们的 GraphQL 解析器中。在 errorHandler 中间件中,我们首先使用 try-catch 机制捕获 GraphQL 查询中可能发生的错误。对于每个错误,我们将其指定为一个格式良好的错误格式,并将其放置到 errors 数组中。最后,我们返回处理后的响应对象。

这样,我们就可以在 GraphQL 查询中捕获和处理所有错误了。我们还可以通过将这个中间件保存在一个文件中,并在需要的 GraphQL 解析器中导入并使用它来实现可重用性和易于维护性。

结论

GraphQL 是一种非常强大的查询语言,但它也带来了一些新的挑战。在 GraphQL API 中,错误处理是一个重要的问题,需要特别注意。在本文中,我们介绍了如何为 GraphQL 编写错误处理中间件,以捕获和处理所有可能发生的错误。通过这种方式,我们可以使代码更加可重用和易于维护,并提高 GraphQL API 的稳定性和可靠性。

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