Apollo + GraphQL - Heuristi c Фрагмент Ручное сопоставление - PullRequest
0 голосов
/ 11 января 2020

У меня есть безголовая Craft CMS, которая возвращает данные в мое приложение Nuxt js через конечную точку GraphQL через Apollo. У меня есть поле, которое может возвращать один из трех различных типов блоков: richText, image и pullQuote.

Моя конечная точка GraphQL выглядит так:

query($section:[String], $slug:[String]) {
    entries(section: $section, slug: $slug) {
        id,
        title,
        uri,
        ... on blog_blog_Entry{
            contentEngine{
                __typename,
                ...on contentEngine_richText_BlockType{
                    __typename,
                    id,
                    richText
                    fontColor,
                    backgroundColor
                }
                ...on contentEngine_image_BlockType{
                    __typename,
                    id,
                    backgroundColor,
                    imageWidth,
                    image {
                        id,
                        url
                    }
                }
                ...on contentEngine_pullQuote_BlockType{
                    __typename,
                    id,
                    backgroundColor,
                    fontColor,
                    quote
                }
            }
        }
    }
}

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

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

Раздражает то, что эта документация приводит к 404. Я нашел несколько других билетов GitHub , которые ссылаются на эту ссылку, поэтому я не уверен, какие шаги я должен выполнить.

Я думаю, что мне нужно сделать, чтобы учить кеш памяти Аполлона. Поскольку мой ответ не так уж сложен, я думаю, что смогу сойти с рук Определение возможных типов вручную .

Я пробовал следующее, но не думаю, что понимаю, как для правильной настройки:

const cache = new InMemoryCache({
    possibleTypes: {
        contentEngine: [
            "contentEngine_richText_BlockType", 
            "contentEngine_pullQuote_BlockType", 
            "contentEngine_image_BlockType"
        ],
    },
});

Любая помощь в решении этой проблемы будет огромной помощью.

ВНИМАНИЕ: heuristi c продолжается сопоставление фрагментов!

Ответы [ 2 ]

1 голос
/ 19 марта 2020

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

import possibleTypes from './possibleTypes.json';
import { InMemoryCache, IntrospectionFragmentMatcher } from 'apollo-cache-inmemory';
const fragmentMatcher = new IntrospectionFragmentMatcher({
    introspectionQueryResultData: possibleTypes
})

Где вы определяете свой клиент, добавляете следующее

cache: new InMemoryCache({
    fragmentMatcher
})

Чтобы сгенерировать свою схему, вы можете либо выполнить приведенный ниже запрос один раз, а затем вставить результаты в possibleTypes.json (не рекомендую, так как вы будете часто это делать) ИЛИ альтернативно добавить этот процесс для вашей функции nuxtInitServer, чтобы он автоматически обновлялся.

query {
  __schema {
    types {
      name
      kind
      possibleTypes {
        name
        description
      }
    }
  }
}
1 голос
/ 11 января 2020

Как указано в документации, использование possibleTypes возможно только при использовании apollo-client версии 3.0 или выше, которая в настоящее время находится в бета-версии. Если вы не используете пакет @apollo/client, как показано здесь , передача параметра possibleTypes ничего не изменит.

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

Вы можете передать опцию возможный тип в конструктор InMemoryCache, чтобы указать отношения супертип-подтип в своей схеме. Этот объект сопоставляет имя типа интерфейса или объединения (супертипа) с типами, которые реализуют или принадлежат ему (подтипам).

Другими словами, вместо использования contentEngine в качестве ключ, вы бы использовали любое имя типа поля contentEngine.

Если вы используете более раннюю версию apollo-client, вам нужно будет создать IntrospectionFragmentMatcher, как указано в документы здесь .

...