GraphQL 中的分页和排序实践

前言

GraphQL 是目前前端领域内非常流行的一种数据查询语言,它让前端的数据查询方式变得更为灵活,以及方便了前后端的交流。相信大家已经有过一些使用 GraphQL 的实践,本文将针对 GraphQL 中的分页和排序这个具体问题进行深入讨论并给出实践方案。

分页

分页是一个非常常见的需求,原生支持分页的 GraphQL 实现是不比 RESTful 的 API 差的,甚至因为 GraphQL 的灵活性,理论上在实现分页时会更为便捷。首先我们来看一下下文我们将要讨论的 users 类型的 schema 的定义:

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

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

对于每一个 users 的查询,我们传入 pageNumberpageSize 两个参数就可以得到对应的用户列表。常见的实现就是先查询整个列表,然后在服务器上进行分页,在最后的查询结果中返回指定的子列表。对于 RESTful API 来说这是非常普遍的做法,但在 GraphQL 中我们可以直接返回子列表,这样查询效率会得到大幅度的提升。针对这样的需求,我们可以使用类似的实现:

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

查询结果可以直接返回分页后的子列表,而分页的总页数可以通过 usersCount 来进行计算,这样就可以减轻服务器的压力,提高数据的查询效率。我们来看一下具体的实现方案:

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

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

代码非常简单,我们只需要用 offset()limit() 方法来实现分页,然后通过 count() 方法来计算总条数即可。需要注意的是,在代码实现中我们使用了 async 和 await 来实现异步操作的效果,这在 node.js 中非常常见,如果您在异步编程中不熟悉的话可以看看 node.js 的异步编程

排序

排序也是一个非常常见的需求,场景如同 RESTful API 一样,需要对查询结果按照某些字段进行升序或者降序排列。GraphQL 通过参数传递来实现排序,这使得在 GraphQL 中进行排序更加灵活。看下方的 users 类型的 schema 定义:

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

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

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

可以看到,我们使用 orderBy 来实现排序,其中定义了一个 input 类型的 OrderBy 输入类型,包含了排序的字段名和排序的方向。在 resolver 中实现也非常简单,我们只需要通过 orderBy() 方法来实现排序即可:

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

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

以上代码和前一个例子的解决方案类似,只是多传入了一个 orderBy 参数,但这个参数非常实用。通过这样的实现,我们可以实现丰富的排序方式,例如按照用户注册时间、名字首字母进行排序等等。

结论

本文介绍了 GraphQL 中分页和排序的实现方法,这些内容对于前端的同学来说是非常实用的,在实际项目中完全可以实现非常良好的查询效果。我们在实现这些功能时候还可以考虑到性能优化方面的不同方案,例如缓存、 Redis 等等,但这些内容并不是本文所涉及的范围,感兴趣的读者可以进一步的了解。希望本文对于读者有所帮助,也欢迎大家在评论区探讨。

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