GraphQL 是一种用于 API 开发的查询语言,它专注于提高数据传输效率和可扩展性。虽然 GraphQL 为前端开发人员提供了许多便利,但是如果不处理错误,它可能会成为一个致命的缺陷,因为它的错误处理方式与传统的 REST API 不同。
在本文中,我们将讨论 GraphQL 中的错误处理技巧,这些技巧不仅可以帮助您识别和纠正错误,还可以提高您的编写可靠代码的技能。
错误类型
在 GraphQL 中,错误有两种类型:语法错误和运行错误。
语法错误
语法错误发生在查询或变异输入中,当 GraphQL 引擎无法将其解析为有效的操作或片段时发生。当客户端发送错误的查询时,服务器会返回带有错误详情的错误对象。
以下是一个示例查询,其中包含语法错误:
-- -------------------- ---- ------- - ----- - -------- -- - ---- ----- -------- - - -
这将返回一个带有以下错误消息的错误对象:
-- -------------------- ---- ------- - --------- - - ---------- ------- ------ -------- ----- ----- --- ------------ - - ------- -- --------- - - - - - -
运行错误
运行错误发生在查询或变异执行期间,当请求无法得到响应或遇到错误时发生。
以下是一个示例查询,其中存在运行错误:
{ user(id: 999) { name email position } }
这将返回一个带有以下错误消息的错误对象:
-- -------------------- ---- ------- - ------- - ------- ---- -- --------- - - ---------- ----- --- ------ ----- ------------ - - ------- -- --------- - - - - - -
错误处理
在 GraphQL 中,有几种处理错误的方法。以下是最常见的三种方法:
1.异常处理
异常处理是最常见的错误处理方法,它使用 try-catch 块捕获并处理可能导致错误的语句。实现异常处理的好处是,它可以封装单个错误,并在多个位置使用错误处理。
以下是一个基于 GraphQL 的异常处理程序的示例:
-- -------------------- ---- ------- ----- ------- - ------------------- ----- - ----------- - - --------------------------- ----- ------- - ------------------- ----- - ------- - - ------------------ ----- - ------------------ -------------- -------------- ----------- --------------- - - -------- ----- -------- - --- ------------------- ----- ------- ------- - --- - ----- ---------- -- ----- - ----- ------------- -- ---- - ----- ---------- -- -- --- ----- --------- - --- ------------------- ----- -------- ------- - ----- - ----- --------- ----- - --- - ----- --- -------------------------- -- -- ---------- ----- - --- - ----- ---- - ----------------- -- ------- - ----- --- ----------- --- ------ ------------- - ------ ----- - ----- ------- - --------------------- ----- ------ - -- -- -- --- ----- ------ - --- --------------- ------ ---------- --- ----- --- - ---------- -------- ----------- ------------- ------- --------- ----- -- -- ---------------- -- -- - ------------------- --------- -- ---- ------- ---
2.自定义错误类
自定义错误类会为特定的错误实现一个包装器。这有助于标准化错误消息和错误代码,以便客户端和服务器端代码都能够处理它们。
以下是一个自定义错误类的示例:
class UserNotFoundError extends Error { constructor(id) { super(`User not found: ${id}`); this.name = 'UserNotFoundError'; this.id = id; } }
可通过以下方式修改异常处理程序以使用 UserNotFoundError:
resolve(_, args) { const user = getUser(args.id); if (!user) { throw new UserNotFoundError(args.id); } return user; },
3.使用 GraphQL 中间件
另一个常见的错误处理方法是使用 GraphQL 中间件。GraphQL 中间件可以在执行查询之前、之后或同时处理解析过程、验证和权限等问题。错误处理器也是其中之一。
以下是一个使用 express-graphql 中间件的示例:
-- -------------------- ---- ------- ----- ------- - ------------------- ----- - ----------- - - --------------------------- ----- ------- - ------------------- ----- - ------- - - ------------------ ----- - ------------------ -------------- -------------- ----------- --------------- - - -------- ----- -------- - --- ------------------- ----- ------- ------- - --- - ----- ---------- -- ----- - ----- ------------- -- ---- - ----- ---------- -- -- --- ----- --------- - --- ------------------- ----- -------- ------- - ----- - ----- --------- ----- - --- - ----- --- -------------------------- -- -- ---------- ----- - ----- ---- - ----------------- -- ------- - ----- --- ----------- --- ------ ------------- - ------ ----- -- -- -- --- ----- ------ - --- --------------- ------ ---------- --- ----- --- - ---------- -------- ----------- ------------- ------- --------- ----- -------------------------- - -- ---- ---- ------ --- ------- ------ ------ - -------- -------------- ----- ------------------- ---------- ----- - ------------------------ - ----- ---------- ---------------- ----- ----------- ----------- ----------------- -- -- ------------ ------ -- - ------ - -------- ----------- ------- ------------------- -- ------------------- -- -- -- -- ---------------- -- -- - ------------------- --------- -- ---- ------- ---
结论
在 GraphQL 中,错误处理非常重要。在处理异常、自定义错误类或使用中间件时,需要小心处理错误,以确保客户端与服务端代码都可以友好地处理它们。通过上述方法进行正确的错误处理,将能更好地识别和纠正错误,提高代码的可信性。
希望这篇文章能让您深刻理解 GraphQL 中的错误处理,并为您的项目提供指导和帮助。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6709c34ed91dce0dc87b7070