GraphQL: как создать запрос с тщательно отобранным списком параметров (2D-массив)

В частности, я чувствую, что ищу ответ на вопрос задали здесь, но оказалось, что заголовок вопроса не идеально подходит для фактического вопроса.

То, что я хочу сделать, включает Relay, React и GraphQL (полагаю, я мог бы указать Relay, и вы могли бы выяснить два других).

Что я хочу сделать и на что, похоже, не могу найти ответа, так это создать запрос, который перечисляет список переменных фрагментов запроса на основе некоторого предопределенного массива JSON.

Если вы посмотрите мою домашнюю страницу, jimmyvanveen.com, вы увидите, что у меня есть список проектов, над которыми я работал (или я работаю над этим), и каждый из них отображается как компонент React. Я беру эти данные из Github через их REST API (v3), но теперь я хочу перейти на GraphQL (v4).

Я могу создать массив, содержащий имя репо и владельца, как того требует схема API Github, но я не знаю, как динамически создавать запрос на основе простого массива, такого как:

repos: [
  {"name": "repo name", "owner": "Repo Owner"},
  {"name": "other repo", "ownder": "Other Owner"}
]

Я знаю, как сделать запрос, который может найти всю эту информацию вручную, но я надеялся, что есть способ GraphQL (возможно, отправив vars?), Чтобы пройти через весь массив в одном запросе и вернуть массив данных репо.

Я много дней ломал себе голову, пытаясь найти ответ здесь или где-нибудь еще, и я вычеркиваю.

Заранее благодарим за любую помощь, которую вы можете оказать!


person Jimmay    schedule 09.04.2018    source источник
comment
К вашему сведению, я понял, что делать то, что я хочу, в принципе невозможно. Это меня раздражает, но я принимаю это, поскольку именно так работает GraphQL, я просто не могу отправить 2D-массив в запрос. В итоге я наткнулся на то, что я считаю лучшим решением, и вы можете увидеть, как я это реализую, в моем репо на Github. Я оставляю этот вопрос открытым на случай, если у кого-то еще есть ответ, о котором я не думал, но в целом я потерял надежду :) Спасибо! Джимми   -  person Jimmay    schedule 09.04.2018


Ответы (1)


Итак, в конце концов я понял, что я просто отправляю неправильную информацию в Github, чтобы вытащить информацию о репо из тщательно подобранного списка.

Моя цель выше по-прежнему невозможна точно так, как я хотел решить проблему, однако метод, упомянутый выше, очень похож на используемый метод, который ДЕЙСТВИТЕЛЬНО работает. Проще говоря, предоставьте Github массив уникальных идентификаторов узлов, а не имя репо и владелец репо, как я пытался сделать.

Таким образом, вы не пытаетесь использовать 2D-массив, а вместо этого используете один массив с такой же степенью специфичности, что и 2D-массив.

Итак, сформулируем такой массив, как:

const repos = [
  'uniqueID1',
  'uniqueID2',
  'uniqueID3',
  ...
];

... затем можно передать через Relay (у меня QueryRenderer был настроен для работы в моем компоненте приложения) следующим образом:

query AppQuery($repos:[ID!]!) {
   projects: nodes(ids:$repos){
     ...projects_projects
   }
 }

Вы можете получить идентификатор узла несколькими способами, но я сделал это, вытаскивая информацию о репо один за другим в GraphiQL с таким запросом, как этот:

query { 
  repository(owner:"JimmayVV", name:"JimmyVanVeen.com") {
    id
  }
}

Затем я объединил все эти идентификаторы в массив и передал его в Relay и получил желаемые результаты.

Я уверен, что есть и другие способы, возможно, используя простой скрипт Node, чтобы сформулировать массив за вас, но для меня это было достаточно просто, и я доволен им.

person Jimmay    schedule 01.09.2018