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