目前在 Web 开发中,GraphQL 得到越来越多的关注。GraphQL 能够充分支持前端开发和 APIs。
在 GraphQL 开发中,使用服务端过滤是非常重要的。服务端过滤可以帮助我们更好地控制我们的查询和操作,提高 API 的效率和性能。
本文将介绍如何在 GraphQL 中使用服务端过滤。我们将学习如何进行过滤、如何编写过滤查询、如何测试过滤查询以及怎样在 GraphQL API 中实现过滤。
过滤方法
GraphQL 的查询语言是非常灵活的,这种灵活性是通过提供过滤器函数来实现的。过滤器函数允许我们对查询进行过滤,以便我们只获得需要的结果。常见的几种方法包括:
where
where 方法可以用来指定查询的限制条件,只有符合指定条件的条目才会被返回。例如:
{ allPosts(where: {published: true}) { id title } }
这个查询获取了所有已发布的帖子。where
参数是必需的,因为它指定了 limit、orderBy 等参数。
order_by
order_by 方法允许我们对查询返回的结果进行排序。例如:
{ allPosts(orderBy: createdAt_DESC) { id title } }
这个查询按照创建时间降序排列所有帖子。
limit
limit 方法用来指定返回结果的数量。例如:
{ allPosts(limit: 10) { id title } }
这个查询返回系统中最近的10条帖子。
offset
offset 方法提供了跳过前 n 项的能力。例如:
{ allPosts(offset: 5) { id title } }
这个查询跳过前 5 条消息并返回接下来的所有帖子。
编写过滤查询
在 GraphQL 中,过滤查询是通过 where
参数来实现的。下面是一些示例:
等于
{ allPosts(where: {published: true}) { id title } }
这个查询返回被发布了的所有帖子。
不等于
{ allUsers(where: {status: {ne: 'banned'}}) { id name } }
这个查询返回所有没有被禁言的用户。
小于
{ allPosts(where: {views: {lte: 100}}) { id title } }
这个查询返回小于或等于100个浏览量的所有帖子。
大于
{ allPosts(where: {views: {gt: 1000}}) { id title } }
这个查询返回超过1000个浏览量的所有帖子。
包含
{ allPosts(where: {title: {contains: "GraphQL"}}) { id title } }
这个查询返回标题中包含“GraphQL”的所有帖子。
正则表达式
{ allPosts(where: {title: {regexp: "GraphQL(.*)"})}) { id title } }
这个查询返回所有标题以“GraphQL”开头的帖子。
测试过滤查询
为了测试过滤查询的正确性,我们可以使用 GraphiQL
。GraphiQL
是一个 GraphQL 环境,可以方便地测试 API,看到我们的查询和结果。
下面是一些示例:
测试等于查询
{ allUsers(where: {status: {eq: 'banned'}}) { id name } }
所有 result 在查询期间都包含“banned”。
测试不等于查询
{ allUsers(where: {status: {ne: 'banned'}}) { id name } }
所有 result 在查询期间不包含“banned”。
测试小于查询
{ allPosts(where: {views: {lt: 1000}}) { id title } }
所有 result 在查询期间的浏览量小于1000。
测试大于查询
{ allPosts(where: {views: {gt: 100}}) { id title } }
所有 result 在查询期间的浏览量超过100。
实现过滤
为了在 GraphQL API 中实现过滤,我们需要创建适当的参数。我们可以使用 GraphQLInputObjectType
来定义一个新的输入对象类型。
例如,我们可以创建一个名为 BlogFilter
的输入对象类型如下:
-- -------------------- ---- ------- ----- ---------- - --- ------------------------ ----- ------------- ------------ ------- --- ------- ------- -- -- -- --- - ----- ---------- -- ------ - ----- ------------- -- ---------- - ----- -------------- - -- --
这个过滤器包括许多常见属性,例如 id
、title
和 published
。
我们还可以扩展此过滤器的功能,以包括其他操作符和属性。
然后,我们可以在我们的查询和 mutation 类型中使用这个输入对象。例如,对于我们的查询类型,我们可以添加一个名为 allBlogs
的字段:
-- -------------------- ---- ------- ----- ----- - --- ------------------- ----- -------- ------- - --------- - ----- --------- ----- - ------- - ----- ---------- - -- -------- --- ----- -- ------------------------------- - - --
这个 allBlogs
查询现在接受一个名为 filter
的参数,用于过滤我们的博客。然后我们将过滤器传递给我们的 blogLoader
,该 loader 将使用 where
参数对我们的查询执行过滤。
结论
在本文中,我们已经了解了如何在 GraphQL 中使用服务端过滤。我们已经详细介绍了常见的过滤方法、编写过滤查询和测试过滤查询的方法,并且学习了如何在 GraphQL API 中实现过滤。这些方法将帮助我们更好地控制查询和操作,提高 API 的效率和性能。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/66f0eea46fbf960197346b7f