使用@skip on";空";使用graphql的字段
给定以下GQL使用@skip on";空";使用graphql的字段,graphql,Graphql,给定以下GQL query getMembers { repository(owner: "nasa", name: "cumulus") { mentionableUsers(first: 100) { nodes { login organization(login: "nasa") { login } } } } } (对GitHub v4 GraphQL的查询) orga
query getMembers {
repository(owner: "nasa", name: "cumulus") {
mentionableUsers(first: 100) {
nodes {
login
organization(login: "nasa") {
login
}
}
}
}
}
(对GitHub v4 GraphQL的查询)
organization
下的login
值为“nasa”
或null
我试图弄清楚是否可以对登录/组织使用@skip,这样只显示repo的贡献者,即nasa组织的成员。我相信对于这个特定的查询,您可以用另一种方式进行,但这只是一个示例
如何将@skip/@include与非布尔值一起使用。关于这方面的文档很少。虽然我可以在客户端应用程序中过滤响应JSON,但接收较少的通过网络发送的数据,然后在我的应用程序中进行解析会更有效
在GraphQLi中玩时,我通过各种方式收到了错误——也许只有当字段本身返回布尔值时才可能
e、 例如,我无法执行login@skip(如果login==null)
。我还尝试在variables部分将一个值设置为null,并在查询中引用它,但我尝试的变体都不起作用
如果子字段是某个值,我真正想做的是不包括父字段。e、 例如,如果login=null,则不包括可提及的用户。在可提及用户上没有搜索字段选项。根据我的阅读,我猜唯一的方法是修改API,在用户界面上放置搜索或筛选字段,否则我需要对我的客户机执行此操作
@skip
和@include
指令都提供相同的功能——允许客户端任意选择是否在请求中包含字段
假设我们有这样一个查询:
query ($skipBar: Boolean!) {
foo
bar @skip(if: $skipBar)
}
如果我将skipBar
设置为true
,我实际上只是发送此查询:
query {
foo
}
query {
foo
bar
}
如果我将其设置为false
,我实际上只是发送此查询:
query {
foo
}
query {
foo
bar
}
作为客户机,我的逻辑必须确定要分配给skipBar
的值,但我也可以轻松地使用相同的逻辑来决定是否发送这两个查询中的一个。换句话说,与变量和片段一样,@skip和@include只是在客户端保持干燥的一种方便方法它们不能用于筛选服务器返回的结果。
GraphQL语法不支持表达式(或者说,不支持对响应部分的任何形式的引用)。另外,@skip
和@include
只接受一个参数(如果
),并且该参数必须作为变量或文本值传递一个布尔值。即使您可以通过某种方式将表达式传递给if
参数,指令也会确定该字段是否包含在请求period中。因此,如果跳过的字段是返回列表的一部分(如节点列表),则在跳过它时,每个节点都不存在该字段
那么,有解决办法吗?
不完全是:(正如您已经猜到的,如果GitHub API没有提供一种过滤字段的方法,那么作为一个客户端,您可以做的事情就不多了——您必须在客户端应用过滤逻辑。因此,折衷的办法是,我可以在一个查询中获得更多数据,但我有可能获得大量数据,这可能需要更多的时间来加载和处理。使用GQL,您受到限制根据API设计人员的选择,这似乎不是一个真正的折衷,因为在这件事上你没有选择,但是是的。这与使用REST没有什么不同——过滤返回的数据是必须由服务器的代码来处理的事情,所以如果服务器没有实现它,客户端就不能对此做任何事情能够任意过滤结果会很方便,但我想这也会与API可能实现的其他功能不兼容,比如分页。