如何在 Sangria 中使用 graphql 查询过滤列表响应

Posted

技术标签:

【中文标题】如何在 Sangria 中使用 graphql 查询过滤列表响应【英文标题】:How do you filter a list response using a graphql query in Sangria 【发布时间】:2019-02-06 07:18:30 【问题描述】:

我在 Sangria (scala) 上运行一个 graphQL 服务器。这是一个示例查询:

query 
  missions  
    missionId  id  ,
    name
  

和一个示例响应:


  "data": 
    "missions": [
      
        "missionId": 
          "id": "mission1"
        ,
        "name": "foo"
      ,
      
        "missionId": 
          "id": "mission2"
        ,
        "name": "bar"
      
    ]
  

我正在寻找过滤列表并仅返回具有mission1 作为id 的元素的查询?

【问题讨论】:

【参考方案1】:

您需要实现分页。将limit(pageSize) 参数传递给graphql 服务器resolver。在服务器端处理数据。

query 
  missions(limit: 1)  
    missionId  id  ,
    name
  

服务器端:

const resolvers = 
  Query: 
    missions: (_, limit, ctx) => 
      const missions = [];

      for(let i = 0; i < limit; i++) 
        missions.push(db.missions[i])
      
      return missions;
    
  

那是graphql ideology,前端开发者定义数据结构和他们想要获取的数据。

通过http请求查询list数据是个坏主意。而filter前端的数据使用directivegraphql的其他方式。浪费带宽。

【讨论】:

我明白你的意思,但是我一直在寻找一个过滤器,即missions(missionId(id: "mission1")),但听起来这也是必须在服务器端实现的东西? @reikje 是的。它是。您不应该在客户端过滤数据。

以上是关于如何在 Sangria 中使用 graphql 查询过滤列表响应的主要内容,如果未能解决你的问题,请参考以下文章

了解 GraphQL / Sangria-Graphql 中服务器端的特定字段

如何知道 Sangria GraphQL 中对象解析器中的请求字段

了解 Sangria-graphql 执行器

sangria graphql 查询返回 1 个元素列表

Sangria-graphql:将 derivedInputObjectType 作为变异参数传入时出错

Graphiql 中标记为非空的所有字段和参数:Sangria,scala