GraphQL 是一种用于 API 的查询语言,它可以让客户端精确地指定需要的数据,从而避免了传统 RESTful API 中的“过度获取数据”的问题。然而,与任何技术一样,GraphQL 中也有错误处理的问题,这篇文章将深入探讨 GraphQL 中的错误处理。
GraphQL 中的错误类型
GraphQL 中的错误分为两种类型:语法错误和运行时错误。
语法错误
语法错误是在解析 GraphQL 查询时发生的错误,这些错误通常是由于查询字符串中的拼写错误或语法错误引起的。GraphQL 引擎会在解析查询字符串时检测到语法错误,并返回一个错误响应。
以下是一个示例查询字符串中的语法错误:
{ user(id: 1) { name email phone } }
在这个查询字符串中,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