Клиент Apollo 3: Данные кэша могут быть потеряны при замене поля nuggets объекта запроса

#apollo-client

#apollo-client

Вопрос:

Я использую Postgraphile для создания схемы Graphql для меня. Я использую клиент Apollo 3, чтобы помочь с запросами / кэшированием. Вот соответствующая форма моей схемы:

Query -> buckets: BucketsConnection -> edges: BucketsEdge -> node: Bucket

Query -> nuggets: NuggetsConnection -> edges: NuggetsEdge -> node: Nugget

nuggets и buckets имеют отношение «много: много».

Когда я пытаюсь создать новую запись для любого из nugget для bucket, я получаю это предупреждение:

Данные кэша могут быть потеряны при замене поля nuggets объекта запроса.

Чтобы решить эту проблему (которая не является ошибкой в клиенте Apollo), определите пользовательскую функцию слияния для поля Query.nuggets, чтобы InMemoryCache мог безопасно объединять эти объекты:

существующий: [{«**typename»:»NuggetsEdge»,»node»:{«**ref»:»Nugget:0343d751-40de-4036-825e-837cb15674c4″}},……… входящие: {«**typename»:»NuggetsConnection»,»edges»:[{«**typename»:»NuggetsEdge»,»node»:{«__ref»:»Nugget:0343d751-40de-4036-825e-837cb15674c4″}},………

Я замечаю, что форма этих 2 разных, и имеет смысл, что они должны соответствовать друг другу, поэтому я сделал это в своей InMemoryCache схеме:

         typePolicies: {
            Query: {
                fields: {
                    nuggets: {
                        merge: (existing = [], incoming) => {
                            return [
                                ...existing, 
                                ...incoming.edges,
                            ]
                        },
                    },
                    buckets: {
                        merge: (existing = [], incoming) => {
                            return [
                                ...existing,
                                ...incoming.edges,
                            ]
                        },
                    },
                },
            },
        },
  

Однако это не решает проблему, и это приводит к data = undefined возврату из запроса Apollo.

Вот моя update функция при мутации ‘createNugget’:

         update(cache, { data: { createNugget } }) {
            cache.modify({
                fields: {
                    nuggets(existingNuggets = []) {
                        const newNuggetRef = cache.writeFragment({
                            data: createNugget.nugget,
                            fragment: gql`
                                fragment NewNugget on Nugget {
                                    id
                                    title
                                    mediaItems
                                }
                            `,
                        })
                        return [
                            ...existingNuggets,
                            newNuggetRef,
                        ]
                    },
                },
            })
        },
  

Итак, мне любопытно узнать, почему кешу, похоже, не нравится формат, который я передаю, потому что incoming кажется, соответствует existing .