解决 GraphQL 中的死循环问题

GraphQL 是一种用于 API 的查询语言和运行时系统,它允许客户端在一个请求中指定需要的数据和数据的结构,而不是多次请求不同的端点来获取数据。然而,使用 GraphQL 时,有时候可能会出现死循环的问题,本文将详细介绍如何解决此类问题。

GraphQL 中的死循环问题

在 GraphQL 中,如果在一个查询中同时嵌套了多个相同的查询项,就会导致死循环。例如,以下的查询就会导致死循环问题:

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

这个查询会一直无限循环下去,因为每个 friends 字段都请求了一遍 user,而每个 user 中也有 friends 字段,从而形成了一个死循环。

解决 GraphQL 中的死循环问题的方法是通过设置一个最大深度并在达到最大深度时中断查询。这样,当查询的嵌套层数达到最大深度时,就会返回一个错误,通知客户端查询已经结束。

使用 GraphQL Depth Limit

GraphQL Depth Limit 是一个 GraphQL 的中间件,可以防止查询无限递归。它可以限制查询嵌套层数,当查询达到最大深度时,就会响应报错。

例子代码:

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

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

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

  --- ---- - ---

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

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

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

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

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

在这个例子中,我们使用了 depthLimit 中间件,并设置了最大深度为 7 层。如果查询中嵌套的层数大于 7,就会返回一个报错。

在 GraphQL Schema 中使用 Depth Limit

如果你正在使用 Apollo Server,可以在 Schema 中使用 depthLimit 选项,如下所示:

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

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

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

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

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

在这个例子中,我们将 depthLimit 设置为 7 层,并将其作为 validationRules 选项传递给了服务器。

结论

在使用 GraphQL 时,我们需要注意避免死循环问题。可以通过设置最大深度来防止查询无限递归,并在达到最大深度时中断查询。在实现中,我们可以使用 GraphQL Depth Limit 中间件、在 GraphQL schema 中使用 Depth Limit 或其他方法来实现。

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