前言
GraphQL 是目前前端领域内非常流行的一种数据查询语言,它让前端的数据查询方式变得更为灵活,以及方便了前后端的交流。相信大家已经有过一些使用 GraphQL 的实践,本文将针对 GraphQL 中的分页和排序这个具体问题进行深入讨论并给出实践方案。
分页
分页是一个非常常见的需求,原生支持分页的 GraphQL 实现是不比 RESTful 的 API 差的,甚至因为 GraphQL 的灵活性,理论上在实现分页时会更为便捷。首先我们来看一下下文我们将要讨论的 users
类型的 schema 的定义:
---- ---- - --- --- ----- ------- ------ ------- ------- ------- ----------- --------- - ---- ----- - ----------------- ----- --------- ------ -------- -
对于每一个 users
的查询,我们传入 pageNumber
和 pageSize
两个参数就可以得到对应的用户列表。常见的实现就是先查询整个列表,然后在服务器上进行分页,在最后的查询结果中返回指定的子列表。对于 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