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