GraphQL 错误补承:真正花了 2 个星期的时间了解 GraphQL

阅读时长 6 分钟读完

GraphQL是一种由Facebook开发的查询语言。它是一种现代的API设计语言,广泛应用于Web应用程序和移动应用程序。GraphQL提供了对应用程序的高度可预测性以及对性能的显着改进。然而,当使用GraphQL进行错误处理时,您可能会遇到一些挑战。在本文中,我们将介绍GraphQL错误补承的概念。

什么是错误补承?

错误补承是一种错误处理技术,可以防止GraphQL查询中的错误导致查询失败。当GraphQL查询中有一个错误发生时,通常会立即中断。这可能会导致查询结果不完整或错误。错误补承可以通过在查询结果中提供部分结果来解决这个问题,而不会中断查询。这使得我们能够更好地处理GraphQL查询中的错误。

如何实现错误补承?

在GraphQL中实现错误补承的方法是通过使用Deferred类。这个类可以异步地处理GraphQL解析器异常,并将数据异步返回。

假设我们有一个博客,博客中有文章,而每篇文章都可以有评论。我们想要从GraphQL获取博客文章和评论。下面是一个简单的GraphQL查询的例子:

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

如果没有错误,这个GraphQL查询会返回文章的标题,内容和评论的作者和正文。但是,如果在评论中有一个错误,GraphQL将中断并返回错误。我们可以通过使用错误补承来解决这个问题。

首先,让我们来定义这个查询的GraphQL类型:

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

注意到我们在评论域的resolve函数中使用了Deferred.handle。这个函数会异步调用传入的函数。如果有报错,错误处理函数会异步地调用,结果会通过解析器异步返回。

假设我们现在在评论中有问题。GraphQL解析器将跳过错误,返回一个内容为“Could not get comments”的评论细节。这个将不会导致查询中断,查询结果中将包含文章的标题、内容和一个空的评论数组。

结论

错误补承是一种策略,可以缓解GraphQL查询中的异常中断问题。虽然这种方法需要花费额外的时间和精力来手动处理错误,但它可以提高查询可预测性和性能。通过了解这种技术,您可以更好地处理GraphQL查询中的异常情况。希望这篇文章对您的学习和实践有所帮助。

示例代码

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

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

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

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

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

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

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

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

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

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

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6735622b0bc820c5824e1fa5

纠错
反馈