使用graphql

时间:2019-04-12 22:54:17

标签: graphql

给出以下GQL

query getMembers {
  repository(owner: "nasa", name: "cumulus") {
    mentionableUsers(first: 100) {
      nodes {
        login
        organization(login: "nasa") {
          login
        }
      }
    }
  }
}

(针对GitHub v4 GraphQL的查询)

loginorganization的值是"nasa"null

我正在尝试确定是否可以对登录/组织使用@skip,以便仅显示回购贡献者(即美国国家航空航天局组织的成员)。我相信对于这个特定的查询,您可以用另一种方式来做,但这只是一个例子。

您如何将@ skip / @ include与非布尔值一起使用。关于此的文档很少。虽然我可以在客户端应用程序中过滤响应JSON,但接收通过网络发送的数据较少然后在应用程序中进行解析会更有效。

在GraphQLi中玩游戏时,遇到这种尝试各种方式的错误-也许只有在字段本身返回布尔值的情况下才有可能?

例如,我无法login @skip(if login==null)。我还尝试将变量部分中的值设置为null并在查询中引用它,但是我尝试的所有变体都没有。

如果子字段是某个值,我真正想做的就是不包括父字段。例如,如果login = null,则不包括该可提及的用户。 sayableUser上没有搜索字段选项。从我的阅读中,我猜想,唯一的方法就是修改API,以便在提到提到的用户上放置一个搜索或过滤器字段,否则我将需要与我的客户进行此操作?

1 个答案:

答案 0 :(得分:1)

点对。

@skip@include伪指令提供相同的功能-允许客户端任意选择是否在请求中包括字段。

假设我们有一个查询,例如:

query ($skipBar: Boolean!) {
  foo
  bar @skip(if: $skipBar)
}

如果将skipBar设置为true,则实际上是在发送以下查询:

query {
  foo
}

如果将其设置为false,则实际上是在发送以下查询:

query {
  foo
  bar
}

作为客户端,我的逻辑必须确定要分配给skipBar的值,但是我可以轻松地使用相同的逻辑来决定在发送这两个查询之一之间进行决定。换句话说,就像变量和片段一样,@ skip和@include只是将内容保持在客户端的简便方法。 它们不能用于过滤服务器返回的结果。

GraphQL语法不支持表达式(或为此,对响应部分的任何形式的引用)。此外,@skip@include仅采用单个参数(if),并且必须将变量 传递给布尔值-作为变量或文字形式值。但是,即使您可以某种方式将表达式传递给if参数,指令也会确定该字段是否包含在请求句点中。因此,如果被跳过的字段是返回的列表(如节点列表)的一部分,则每个节点在被跳过时都将不存在。

那么,有解决方法吗?

不是真的:(正如您已经猜到的那样,如果GitHub API没有提供过滤字段的方法,那么作为客户端您将无能为力-您必须应用过滤逻辑客户端-侧。