GraphQL服务器-如何在字段解析器中传递多个级别的根

时间:2019-02-25 04:04:03

标签: graphql apollo-server

我只是从Apollo GraphQL开始。我有一个类似

的结构

体育游戏->球队->球员

我有一个模式,我可以得到所有的体育游戏,一个可以与所有团队进行比赛,而一个可以与所有玩家进行比赛,所有这些都很好。我还实现了按他们的ID获取每个人。

然后我为团队和球员编写了场解析器,这对于让体育比赛团队或团队球员发挥作用都很好,

这样的查询很好,可以给我给定体育比赛的球队名称。

query Query {
  sportsgame(gameId: "12345") {
    teams {
      name
    }   
  }
}

同样,对于玩家我可以查询:

query Query {
    teams {
      name
      players {
        name
        number
      }
    }   
  }
}

那也很好,给我列出了所有球队和每个球员的名单。

接下来,我想实现让所有团队成员参加体育比赛的方式,

query Query {
  sportsgame(externalId: "12345") {
    teams {
      name
      players {
        name
      }
    }   
  }
}

但是问题是,我不希望这些团队的所有玩家,只希望真正参加比赛的玩家。这就要求我的fieldResolver最了解体育游戏。

因此,我的fieldResolver可以获取作为团队的Root对象,但不能将体育游戏置于顶部,因此我无法访问体育游戏的ID来进一步过滤玩家列表。

我的问题是,我是否应该将体育游戏ID作为可选的隐藏数据通过团队传递?还是在Apollo中更惯用的方式来做这种事情?还是我尝试做这项工作时在概念上有些奇怪?

2 个答案:

答案 0 :(得分:1)

您也可以尝试向玩家添加参数。像

query Query {
  sportsgame(externalId: "12345") {
    teams {
      name
      players(gameId: "12345") {
        name
      }
    }   
  }
}

通过这种方式,您可以从解析程序参数中获取游戏ID。

要不复制游戏ID,您可能需要将参数提取到查询组件中。

query Query($gameId: String!) {
  sportsgame(externalId: $gameId) {
    teams {
      name
      players(gameId: $gameId) {
        name
      }
    }   
  }
}

答案 1 :(得分:1)

您可以将上下文对象用于嵌套的解析器。

解析器功能的签名为:

fieldName(obj, args, context, info) { result }
  

context是特定查询中所有解析程序共享的对象,用于包含每个请求状态。   From the apollo page

这意味着,在sportgame的解析器中,您需要在上下文对象上设置gameId并将其在players的解析器中使用。