readFragment, вызывающий ошибку IntrospectionFragmentMatcher, хотя и не использующий интерфейс или объединения - PullRequest
3 голосов
/ 22 марта 2019

При попытке получить фрагмент запроса появляется следующая ошибка:

"Вы используете простое (эвристическое) средство сопоставления фрагментов, но ваши запросы содержат типы объединения или интерфейса. Клиент Apollo не сможет точно отобразить фрагменты. Чтобы устранить эту ошибку, используйте IntrospectionFragmentMatcher, как описано в документы: https://www.apollographql.com/docs/react/recipes/fragment-matching.html"

Это вызов, который вызывает ошибку.

const sourceData = cache.readFragment({
        id: `${typename}:${idToAdd}`,
        fragment: gql`
          ${sourceFragment}
        `,
      });

где sourceFragment равен

fragment series on PriceSeries {
    id
    title
    description
    commodity
    region
    location
    isDiscontinued
    order
}

Аполлон, похоже, классифицирует возвращаемое значение фрагмента как объединение или интерфейс. Я не думаю, что добавление IntrospectionFragmentMatcher должно быть необходимым, поскольку нам не нужны союзы или интерфейсы, хотя, возможно, я ошибаюсь. Добавление __typename к фрагменту не помогло.

  • Как мне удалить эту ошибку (может, мне просто не хватает синтаксиса gql для набора текста?)
  • Означает ли использование фрагментов, что мы должны установить IntrospectionFragmentMatcher независимо .. (в документах говорится, что это нужно только when using fragments on interfaces or unions, что нам не нужно)
  • Является ли ошибка ошибкой, если я просто скрываю ошибку (она работает как есть, если вы ее игнорируете)

Обновление

ApolloClient создается следующим образом

 client = new ApolloClient({
      link: createLink('MY_URL', Apollo.fetch),
      cache: new InMemoryCache(),
    });

1 Ответ

0 голосов
/ 01 апреля 2019

Вам необходимо создать кеш apollo и настроить функции нормализации с помощью dataIdFromObject.

import { InMemoryCache, IntrospectionFragmentMatcher } from 'apollo-cache-inmemory';

const fragmentMatcher = new IntrospectionFragmentMatcher({
  // Here you may want to pass your introspection query result data,
});

const cache = new InMemoryCache({
  dataIdFromObject: o => o.id,
  fragmentMatcher,
});
...