问题描述
我正在尝试从GitLab加载用户信息,以便可以将用户名与问题相关联。查询问题时,受让人用户名不直接可用。而是可以使用用户ID。
如果我在GitLab部署上使用/-/graphql-explorer
端点执行此GraphQL查询:
query {
users {
nodes {
id
name
username
}
}
}
然后返回91个用户。但是,显然这不是部署中的所有用户。我知道有一些用户存在,但不包含在结果中。我可以使用以下GraphQL查询单独查询它们:
query {
user(username: "someusername") {
id
}
}
并收到似乎正确描述用户的结果。
为什么从此查询的结果中省略了一些用户?我知道较大的结果集需要处理分页,但是默认页面大小应该为100,并且我收到的结果少于此。此外,如果我请求pageinfo
并在生成的endCursor
之后要求用户,我将不会收到任何物品。
如何提交查询以吸引所有用户?失败了,我该如何提交一个查询,让我获得可以成为一个组的所有用户(或者失败,获得一个项目列表)?
解决方法
默认情况下,GitLab的GraphQL API将仅返回任何集合的前100条记录。可以使用第一个或最后一个参数来更改。这两个参数都带有值,因此first:10将返回前10条记录,last:10将后10条记录。
因此,您必须自己进行分页,例如,您的第一个查询:
query {
users(first: 10) {
edges {
node {
id
name
username
}
}
pageInfo {
endCursor
hasNextPage
}
}
}
然后使用PageInfo
结果值来知道是否还有更多页面要获取,而光标ID是否要获取下一页,例如,您可以获得以下结果:
...
"pageInfo": {
"endCursor": "eyJpZCI6Ijc****************zNjk0MDUwMDAgOVRDIn0","hasNextPage": true
}
因此,对于下一页,您必须查询:
query {
users(first: 10,after: "eyJpZCI6IjcxMj**********************Ni4zNjk0MDUwMDAgOVRDIn0") {
edges {
node {
id
name
username
}
}
pageInfo {
endCursor
hasNextPage
}
}
}
依次类推,直到hasNextPage
返回false
。
有关分页和游标的更多信息,请参见GraphQL文档:https://graphql.org/learn/pagination/