Github GraphQL API v.4.0 游标错误

Github GraphQL API v.4.0 cursor misworks

我正在尝试从 Github 获取所有存储库的列表以对其进行一些分析。我已经从他们的 v3.0 API 开始了我的工作,这是一个 Restful,然后当我需要更多信息(如星数)时,我从 v3.0 迁移到 v4.0,它作为 GraphQL 提供。现在我每次请求 100 条记录并递归执行此操作以便能够获取所有记录。

问题与分页作业有关。要进行分页,我必须获取每个请求的 endCursor,然后在下一个请求中,我必须在 属性 之后填写此值。现在的问题是数据没有正确分页。例如:

  1. 请求第一页(没有任何光标)导致不同的记录。
  2. 多次请求同一个光标的页面,也得到不同的结果。
  3. 如果根本不检查这个,并尝试一个接一个地获取,每 100 条记录,与以前的请求有很多重复,这意味着分页无法正常工作。

我发送的查询(在 nodejs 应用程序中)如下:

{
  search(query: "is:public", type: REPOSITORY, first: 100, after: "Y3Vyc29yOjEwMA==") {
    repositoryCount
    userCount
    wikiCount
    pageInfo {
      startCursor
      endCursor
      hasNextPage
      hasPreviousPage
    }
    edges {
      node {
        ... on Repository {
          databaseId
          id
          name
          description
          forkCount
          isFork
          issues {
            totalCount
          }
          labels (first: 100) {
            nodes {
              name
            }
          }
          languages (first: 100) {
            nodes {
              name
            }
          }
          licenseInfo {
            name
          }
          nameWithOwner
          primaryLanguage {
            name
          }
          pullRequests {
            totalCount
          }
          watchers {
            totalCount
          }
          stargazers {
            totalCount
          }
        }
      }
    }
  }
}

正如我之前所说,第一次,我从搜索输入中删除参数 after,然后使用上一个请求的 endCursor 作为下一个请求的 after 参数。

我是否没有理解游标的用途及其用法,或者这是 Github 本身的错误 (intended/unintended)?

幸运的是,我找到了一种目前可行的方法。非常感谢@Daniel Rearden 提供的非常有用的提示。我测试了很多查询字符串,发现如果我请求一个特定的创建日期,那么数据会根据这个字段进行排序,在我的测试中,现在顺序保持一致,光标将有意义。

查询现在是这样的:

{
  search(query: "created:2008-02-08 is:public", type: REPOSITORY, first: 100) {
    repositoryCount
    userCount
    wikiCount
    pageInfo {
      startCursor
      endCursor
      hasNextPage
      hasPreviousPage
    }
    edges {
      node {
        ... on Repository {
          databaseId
          id
          name
          description
          forkCount
          isFork
          issues {
            totalCount
          }
          labels (first: 100) {
            nodes {
              name
            }
          }
          languages (first: 100) {
            nodes {
              name
            }
          }
          licenseInfo {
            name
          }
          nameWithOwner
          primaryLanguage {
            name
          }
          pullRequests {
            totalCount
          }
          watchers {
            totalCount
          }
          stargazers {
            totalCount
          }
          createdAt
          updatedAt
          diskUsage
        }
      }
    }
  }
}

现在我唯一应该考虑的是滚动几天并每天多次进行此查询,直到 pageInfo.hasNextPage 为真。

到现在为止,我还没有测试这 4000 天,可能我无法验证获取的结果是否是他们数据库中存在的所有数据,但这似乎是最好的解决方案。