Реагировать родной запросов graphql с реле не работает


Я вроде как потерялся с этим вопросом, так что любая помощь будет оценена! Итак, вот запрос, который я хотел бы отправить:

query {
  viewer{
    search_places(lat: "40.7127", lng: "-74.0059", searchType:"all", searchTerm:"shopping"){
      edges{
        node{
          id,
          name, 
          lat,
          lng
        }
      }
    }
  }
}

Пока все хорошо, этот запрос работает, когда я пробую его на GraphiQL. Этот запрос возвращает объект PlaceConnection. Теперь я попытался реализовать то же самое на React Native с Relay:

class SearchPlacesRoute extends Route {
  static paramDefinitions = {
    lat        : { required: true },
    lng        : { required: true },
    searchType : { required: true },
    searchTerm : { required: true }
  }
  static queries = {
    search_places: () => Relay.QL`
      query {
        viewer{
          search_places(lat: $lat, lng: $lng, searchType: $searchType, searchTerm: $searchTerm) 
        }
      }
      `
  }
  static routeName = 'SearchPlacesRoute'
}

class SearchPlacesComponent extends Component {
  render () {
    const places = this.props.search_places;
    console.log(places);
    for (var index = 0; index < places.length; index++) {
        var element = places[index];
        console.log(element);
      }
    return (
      <View>
        <Text>email: {places[0].name}</Text>
      </View>
    )
  }
}

SearchPlacesComponent = Relay.createContainer(SearchPlacesComponent, {
  fragments: {
    search_places: () => Relay.QL`
      fragment on PlaceConnection {
          edges 
          {
            node 
            {
              id,
              name,
              lat,
              lng
            }
          }
        }
      `
  }
}) 

<RootContainer
  Component={SearchPlacesComponent}
  route={new SearchPlacesRoute({lat:"40.7127", lng: "-74.0059", searchType:"all",searchTerm: "shopping"})}
  renderFetched={(data) => <SearchPlaces {...this.props} {...data} />}/>

Но когда я пытаюсь захватить данные с этим, я получаю следующую ошибку:

1. Objects must have selections (field 'search_places' returns PlaceConnection but has no selections)
       _search_places40zPNn:search_places(lat:"40.7127",lng:"-7
       ^^^
2. Fragment F0 on PlaceConnection can't be spread inside Viewer
       ...F0
       ^^^

Итак, я изучил, что на самом деле отправляется в сервер: Введите описание изображения здесь

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

Редактировать:

Вот мой окончательный код-надеюсь, он будет полезен для некоторых: https://gist.github.com/adamivancza/586c42ff8b30cdf70a30153944d6ace9

1 2

1 ответ:

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

class SearchPlacesRoute extends Route {
  static queries = {
    viewer: () => Relay.QL`
      query {
        viewer
      }
      `
  }
  static routeName = 'SearchPlacesRoute'
}

Затем, внутри вашего компонента, определите его как fragment on viewer, а не на PlaceConnection:

SearchPlacesComponent = Relay.createContainer(SearchPlacesComponent, {
  initialVariables: { lat: "..." /* TODO */ },
  fragments: {
    viewer: () => Relay.QL`
      fragment on viewer {
        search_places(lat: $lat, lng: $lng, searchType: $searchType, searchTerm: $searchTerm) {
            edges 
            {
              node 
              {
                id,
                name,
                lat,
                lng
              }
            }
          }
        }
      `
  }
}) 

Вам нужно будет переместить переменные ($lag, $lng, и т.д.) быть определенным как часть контейнера, а не как часть маршрута. Но я думаю, что это должно решить вашу проблему.