Сервер GraphQL - как передать более одного уровня root в распознаватель полей - PullRequest
0 голосов
/ 25 февраля 2019

Я только начинаю с Apollo GraphQL.У меня есть такая структура, как

sportsgame -> команды -> игроки

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

Затем я написал решатели полей для команды и игрока, и все это хорошо работает, получая команды для спортивной игры или игроков для команды,

, поэтому эти видызапросы в порядке и дают мне названия команд для данной спортивной игры.

query Query {
  sportsgame(gameId: "12345") {
    teams {
      name
    }   
  }
}

И также для игрока я могу запросить:

query Query {
    teams {
      name
      players {
        name
        number
      }
    }   
  }
}

И это тоже хорошо работает, давая мне списоквсе команды и игроки в каждой.

Далее я хотел реализовать сбор всех игроков для команды для спортивной игры, например:

query Query {
  sportsgame(externalId: "12345") {
    teams {
      name
      players {
        name
      }
    }   
  }
}

Но проблема в том, что я неt всех игроков для этих команд, только тех, которые действительно играют в турнире.И это требует, чтобы мой fieldResolver знал о спортивной игре на самом верху.

Так что мой fieldResolver может получить объект Root, который является командой, но он не получает спортивную игру наверху, и поэтому я могу 't получить доступ к идентификатору спортивной игры для дальнейшей фильтрации списка игроков.

Мой вопрос заключается в том, должен ли я просто передавать идентификатор спортивной игры через команду в качестве дополнительного фрагмента скрытых данных?Или это какой-то более идиотский способ сделать подобные вещи в Аполлоне?Или я делаю что-то концептуально странное, даже пытаясь заставить это работать?

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

Вы можете использовать объект контекста для своих вложенных распознавателей.

Подпись функции распознавателя:

fieldName(obj, args, context, info) { result }

context - это объект, общий для всех распознавателейв конкретном запросе, и используется для хранения состояния для каждого запроса. со страницы apollo

Это означает, что в преобразователе для sportgame вы устанавливаете gameId для объекта контекста и используете его в преобразователе для players.

0 голосов
/ 25 февраля 2019

Вы также можете попробовать добавить параметр к игрокам.Так что-то вроде

query Query {
  sportsgame(externalId: "12345") {
    teams {
      name
      players(gameId: "12345") {
        name
      }
    }   
  }
}

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

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

query Query($gameId: String!) {
  sportsgame(externalId: $gameId) {
    teams {
      name
      players(gameId: $gameId) {
        name
      }
    }   
  }
}
...