4

Github からすべてのリポジトリのリストを取得して分析しようとしています。Restful API である v3.0 API を使用して仕事を開始し、星の数などの詳細情報が必要になったときに、v3.0 から GraphQL として提供される v4.0 に移行しました。現在、毎回 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 自体のバグ (意図的/意図的でない) ですか?

4

1 に答える 1