2016-08-18 3 views
2

Я как бы потерял эту проблему, поэтому любая помощь будет оценена! Так вот вопрос, который я хотел бы отправить:Реагировать Нативный запрос 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 с реле:

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 
     ^^^ 

Так я изучил то, что на самом деле отправлено сервер: enter image description here

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

EDIT:

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

ответ

2

Я думаю, что проблема в том, что ваш реле маршрута слишком глубоко. Вместо этого, определить свой маршрут, чтобы просто запросить против 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 и т. д.) должны быть определены как часть контейнера, а не как часть маршрута. Но я думаю, что это должно решить вашу проблему.

+0

Ты мой человек @ryan! Спасибо за информацию - мне, наконец, удалось запустить запрос сейчас, основываясь на вашем ответе. Будет опубликовать весь мой код. Еще один вопрос: Вы указали поле 'edge' в соединении с именем' search_places', но вы не указали для этого аргумента. Используйте либо аргумент 'find',' first', либо 'last'. Есть ли у вас какие-либо советы относительно того, как мне установить эти значения? Не нужно ли это автоматически выполнять реле? – Roosevelt

+0

Поэтому для реле требуется использовать аргумент 'first' или' last', хотя GraphQL этого не делает. Вы хотите добавить его в 'search_places (first: 100)' например, чтобы получить первые 100 поисковых мест. Если вы хотите их всех, вы можете использовать обход вроде «first: 999999999». – Ryan

Смежные вопросы