GraphQL, React, Apollo - ожидаемый итерируемый, но не найден для поля "..." - PullRequest
1 голос
/ 24 марта 2020

Я начинающий студент, работаю над личным проектом. Я пытаюсь создать простое веб-приложение, которое запрашивает список героев из API (https://docs.stratz.com/index.html) и отображает их идентификатор и отображаемое имя на веб-странице. Я успешно сделал нечто подобное с запуском SpaceX, но я не могу заставить это работать.

После настройки моего сервера и запуска на локальном порту я получаю сообщение об ошибке «Ожидаемый итерируемый, но не найден для поля RootQueryType.Heroes». Я почти уверен, что это потому, что в моей схеме я определил мой RootQuery следующим образом:

const HeroType = new GraphQLObjectType({
  name: 'Hero',
  fields: () => ({
    id: {type: GraphQLInt },
    displayName: {type: GraphQLString },
  })
});


// Root Query
const RootQuery = new GraphQLObjectType({
  name: 'RootQueryType',
  fields:{
    //list of heroes
    Heroes: {
      type: new GraphQLList(HeroType),
      // This is where we get data
      resolve(parent, args){
        return axios
          .get('https://api.stratz.com/api/v1/Hero')
          .then(res => res.data);
      }
    }
  },
});

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

{
  "additionalProp1": {
    "id": 0,
    "name": "string",
    "displayName": "string",
    "shortName": "string",
    "abilities": [
      {
        "heroId": 0,
        "gameVersionId": 0,
        "slot": 0,
        "abilityId": 0
      }
    ],
    "roles": [
      {
        "heroId": 0,
        "roleId": 0,
        "gameVersionId": 0,
        "level": 0
      }
    ],
    "talents": [
...
// the list goes on and on with all sorts of info

Пожалуйста, исправьте меня, если я ошибаюсь, но я считаю, что моя проблема в том, что моя схема. js файл не работает с «AdditionalProp1», как указано в их примере. Может ли кто-нибудь указать мне правильное направление исправления моей схемы, чтобы справиться с этим?

1 Ответ

1 голос
/ 24 марта 2020

Появляющийся вами API-интерфейс возвращает объект, который представляет собой карту идентификаторов героев для объектов героев. Это выглядит так:

{
  "1": {
    "id": 1,
    "name": "npc_dota_hero_antimage",
    ...
  },
  "2": {
    "id": 2,
    "name": "npc_dota_hero_axe",
    ...
  },
  ...
}

Вместо этого мы хотим получить массив этих объектов. Одним из способов сделать это было бы что-то вроде:

.then(res => {
  const heroesById = res.data
  // get an array of the keys of the object
  const ids = Object.keys(heroesById) 
  // map over the array
  return ids.map(id => heroesById[id])
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...