如何在 GraphQL 中进行分页查询

阅读时长 6 分钟读完

GraphQL 是一种新兴的 Web API 技术,因为其强大的查询语法和可扩展性而获得了越来越多的关注。它不仅可以支持各种前端技术,而且也可以轻松地在后端积极维护。

在大多数应用程序中,对数据进行分页查询是必须的。在这篇文章中,我们将深入了解如何在 GraphQL 中实现分页查询。

为什么需要分页查询?

分页查询通常是在 Web 应用程序中使用的一种技术,该技术有许多优点。下面是一些优点:

  • 较好的性能:分页查询使我们能够仅检索少量数据。这样可以避免请求过大导致的网络拥堵和阻塞,减少服务器负担并提高响应时间
  • 更少的数据传输:只查询所需数据可以节省带宽,减少延迟时间并提高加载速度
  • 更好的用户体验:数据在逐渐加载时渐进式显示,提高用户体验,并避免整个页面的等待

在 GraphQL 中实现分页查询,通常需要以下步骤:

1. 定义查询参数

我们可以简单地定义一个输入类型来表示分页查询参数。此输入类型应该包含以下参数:

2. 声明查询字段

我们需要声明查询字段以返回分页数据。通常,我们需要在查询中传递“分页数据”和“分页信息”两个参数。分页信息包括总记录数,当前页码以及每页显示的记录数:

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

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

3. 定义 resolver 函数

在 resolver 中,我们需要计算要查询的skip和limit值,并且返回分页信息:

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

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

传递的post 字段, skip(skipCount)take(pageSize)这两个函数,可以用于计算查询跳过的记录数和每个分页应返回的记录数。

4. 解析 edges 和 cursor

在我们的getPosts函数中,我们需要返回简单的数组。这样做是为了兼容连接规范中的edgescursor,使我们面向更多连接与分页的库,相关库可以基于连接对象支持更强大的分页特性, 比如:只要光标在上一页,就根据之前的光标获取最新的论点数据。因此,我们还需要知道如何解析edgescursor

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

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

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

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

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

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

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

在上面的代码中,我们在生成 postEdge 时将 ID 转成了 base64,这是必要的,因为 graphql 规范中指定了 cursor 必须是字符串类型。

我们同样提供了两个实用函数: cursorToID(cursor)getNodeByCursor (edges, cursor)。前者应该根据你的要求进行修改。后者查找给定光标的儿子节点,并尝试将其返回,如果不存在,则返回 null。

5. 查询分页数据

我们可以使用以下查询来获取分页数据:

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

在这个查询中,我们传递了一个input参数,这个参数包含page和pageSize参数。我们使用这些参数来获取所需的数据。此查询将返回一个包含帖子的 edges 数组的对象,以及有关总记录数、yed数据的数量和当前页码的其他信息。

结论

现在您已经掌握了在 GraphQL API 中进行分页查询的概念和实现方法。使用__Pagination Extension__ 或 Relay 库可减少编写此代码的时间和工作量。

虽然它是一项有点棘手的任务,但掌握这个技能将使你能够创建高效的分页查询,从而提高用户体验和页面性能。

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

纠错
反馈