Как использовать часть ответа POST в качестве аргумента для другого почтового запроса? (нумерация страниц для GraphQL) - PullRequest
0 голосов
/ 30 июня 2018

Я хочу сделать несколько POST-запросов к API Github GraphQL с разбивкой на страницы с помощью endCursor.

var unirest = require ('unirest');
var async = require('async');
const endpoint="https://api.github.com/graphql"
const token = "sometoken";

var search_query={
  "query": 'query($name: String!, $after: String){\
          search(query:$name, type: USER, first: 2, after: $after){\
                userCount\
                pageInfo{endCursor}\
                nodes{\
                   ...on User{\
                          id \
                          bio \
                          html_url:url \
                         }\
                       }\
                     }\
                   }',
     "variable": {"name":"somename", "after":null}
    };
unirest.post(endpoint)
.headers({"Content-Type": "text/html" , "Authorization": "bearer "+token, 'user-agent': 'node.js'})
.send(JSON.stringify(search_query)) //creating requests
.end(function(response, request){
    console.log(response.body.data.search.pageInfo.endCursor);
  });

Я хочу повторить этот запрос POST несколько раз. Каждый раз с $ after в качестве endCursor от последнего запроса. Как бы я это сделал? Спасибо!

1 Ответ

0 голосов
/ 07 июля 2018

Сначала я бы порекомендовал вам также получить hasNextPage со страницы информации чтобы вы могли знать, когда вы достигли конца.

После этого вам просто нужно лучше структурировать свой код

изменить search_query на функцию, подобную этой:

function searchQuery(after = null) {
  return {
    "query": `query($name: String!, $after: String){
          search(query:$name, type: USER, first: 2, after: $after){
                userCount
                pageInfo {
                    hasNextPage
                    endCursor
                }
                nodes{
                   ...on User{
                          id 
                          bio 
                          html_url:url 
                         }
                       }
                     }
                 }`,
    "variable": {
      "name": "somename",
      "after": after
    }
  };
};

сейчас searchQuery возвращает запрос на основе пункта after
так что вам нужно создать логический "while", который закончится, когда ответ hasNextPage будет ложным:

function queryServer(after) {
  unirest.post(endpoint)
    .headers({
      "Content-Type": "text/html",
      "Authorization": "bearer " + token,
      'user-agent': 'node.js'
    })
    .send(JSON.stringify(searchQuery(after))) //creating requests
    .end(function(response, request) {
      // do stuff with the result
      console.log(response.body.data.search.pageInfo.endCursor);
      
      // if there are more pages get them
      if (response.body.data.search.pageInfo.hasNextPage) {
        return queryServer(response.body.data.search.pageInfo.endCursor);
      }
    });
}

queryServer(null);

Примечание: я не тестировал код, и IMO код мог бы быть намного чище с другим пакетом запросов, например axios , который поддерживает promises, и тогда вы могли бы даже включить async/await, так было бы намного проще использовать и понимать вместо той ужасной рекурсии, которая нужна сейчас ...

...