GraphQL 中的分页查询实现方式

阅读时长 8 分钟读完

GraphQL 是一种新兴的 API 查询语言,它与传统的 RESTful API 不同,它可以更精确和灵活地查询和获取数据。在 GraphQL 中,分页查询是非常常见的需求,本文将介绍 GraphQL 中的分页查询实现方式。

传统的分页查询

在传统的 RESTful API 中,分页查询通常是通过 limitoffset 参数来实现的,例如:

这个请求将返回第 21-30 条用户记录。这种方式虽然简单,但它存在一些问题:

  • 如果数据量非常大,那么每次查询都需要返回全部数据,这会导致网络带宽和服务器资源的浪费。
  • 如果数据量非常小,那么每次查询都需要返回全部数据,这会导致网络带宽和服务器资源的浪费。

GraphQL 中的分页查询

在 GraphQL 中,分页查询可以通过 firstafter 参数来实现,例如:

-- -------------------- ---- -------
----- -
  --------------- --- ------ ----- -
    ----- -
      ------
      ---- -
        --
        ----
      -
    -
    -------- -
      -----------
      ---------------
      -----------
      ---------
    -
  -
-
展开代码

这个查询将返回第 21-30 条用户记录,其中 first 参数表示要返回的记录数,after 参数表示从哪个游标开始查询。返回的结果包含一个 edges 数组和一个 pageInfo 对象。edges 数组包含了每条记录及其游标,pageInfo 对象包含了分页信息,例如是否有下一页,是否有上一页,起始游标和结束游标等。

实现方式

在 GraphQL 中,分页查询的实现方式通常有两种:

基于游标的分页

基于游标的分页是一种常见的分页方式,它可以避免传统的分页查询中的问题。在 GraphQL 中,基于游标的分页可以通过 cursor 字段来实现,例如:

-- -------------------- ---- -------
----- -
  --------------- --- ------ ----- -
    ----- -
      ------
      ---- -
        --
        ----
      -
    -
    -------- -
      -----------
      ---------------
      -----------
      ---------
    -
  -
-
展开代码

这个查询将返回第 21-30 条用户记录,其中 after 参数指定了从哪个游标开始查询,edges 数组中的每个元素都包含了一个 cursor 字段,表示该记录的游标。pageInfo 对象中的 startCursorendCursor 字段分别表示了当前页的起始游标和结束游标。

基于页码的分页

基于页码的分页是另一种常见的分页方式,它可以更直观地展示当前页的位置和总页数。在 GraphQL 中,基于页码的分页可以通过 pageperPage 参数来实现,例如:

-- -------------------- ---- -------
----- -
  -------------- -- -------- --- -
    ----- -
      ------
      ---- -
        --
        ----
      -
    -
    -------- -
      -----------
      ---------------
      -----------
      ---------
      ----------
      -----------
      -------
      ----------
    -
  -
-
展开代码

这个查询将返回第 21-30 条用户记录,其中 page 参数指定了当前页码,perPage 参数指定了每页返回的记录数。pageInfo 对象中的 totalPagescurrentPage 字段分别表示了总页数和当前页码,perPage 字段表示了每页返回的记录数,totalCount 字段表示了总记录数。

示例代码

以下是一个使用基于游标的分页查询的示例代码:

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

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

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

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

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

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

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

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

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

----------------------- --- -- -- -
  --------------- ------ ----- -- ---------
---
展开代码

这个示例代码中定义了一个 User 类型和一个 UsersConnection 类型,UserEdge 类型表示了一个带游标的用户记录。allUsers 查询接受一个 first 参数和一个 after 参数,返回一个 UsersConnection 对象,其中 edges 数组包含了每个带游标的用户记录,pageInfo 对象包含了分页信息。查询时,根据 after 参数来确定起始游标,并根据 first 参数来确定返回的记录数,最后根据返回的记录数来确定结束游标和是否有下一页。

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

纠错
反馈

纠错反馈