Apollo Cache - Отсутствует набор выбора для объекта типа undefined, возвращаемого для имен полей запроса - PullRequest
0 голосов
/ 04 марта 2019

Я создаю приложение с apollo-boost, которое должно включать уже некоторые пакеты для создания приложения реагирования с graphql.

В данный момент я вижу ошибку, я хочу сохранить фрагменты данныхв мой кеш Apollo.

ApolloClient.tsx

import ApolloClient from 'apollo-boost'
import { InMemoryCache } from 'apollo-cache-inmemory'

import { secretToken } from './secretToken'

const cache = new InMemoryCache({
})

const client = new ApolloClient({
  uri: 'https://someUrlIremovedForTheQuestion.com',
  request: async operation => {
    operation.setContext({
      headers: {
        Authorization: secretToken
      }
    })
  },
  cache
})

client.writeData({
  data: {
    names: [
      {
        firstName: 'Mario'
      },
      {
        firstName: 'Luigi'
      }
    ]
  }
})
export default client

Теперь я пытаюсь получить доступ к этим именам, которые я создал здесь в той же конфигурации apollo:

MyComponent.tsx

const result = client.readQuery({ query: gql`
      query namesCached {
        names @client
      }`
    })
console.log(result)

это всегда относится к этой ошибке:

Missing selection set for object of type undefined returned for query field names

Если я делаю один фрагмент данных, например name: 'Mario', это прекрасно работаети извлекать этот фрагмент данных, но для более глубоких объектов или массивов это всегда дает сбой с этой ошибкой.

Я также использую Typescript

Есть идеи, что может быть?Переполнение стека показывает мне пару нерабочих ответов, и GitHub также не предоставляет мне решения ...

Edit Итак, вот мой реальный пример, чтобы сделать его ближе к моемуреальная проблема:

<Query
    query={fetchdata}
    onCompleted={({ repository }) => client.writeData({
        data: {
          issues: repository.issues.edges
        }
      })
    }
  >

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

Я пытался просто с repository, но все еще с той же ошибкой

Чтобы извлечь данные, я делаю то же, что и выше, но с issues вместо names

1 Ответ

0 голосов
/ 04 марта 2019

Документы могут лучше справиться с этим, но объекты, которые вы храните в кеше, всегда должны иметь соответствующий __typename.Кроме того, если вы собираетесь хранить несколько объектов одного типа в кэше, вы должны включить свойство id, чтобы обеспечить генерацию уникального ключа кэша для каждого элемента.Другими словами, ваше начальное состояние должно быть:

names: [
  {
    __typename: 'Name',
    id: 0,
    firstName: 'Mario',
  },
  {
    __typename: 'Name',
    id: 1,
    firstName: 'Luigi'
  }
]

Затем вы запрашиваете состояние следующим образом:

query namesCached {
  names @client {
    firstName
  }
}

Стоит отметить, однако, что вышеупомянутое не является необходимым, если выХраните предметы.Если вы работаете со скалярами, например так:

names: [
  'Mario',
  'Luigi',
]

Тогда вам не нужен набор выбора:

query namesCached {
  names @client
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...