Apollo客户端3:替换查询对象的块字段时,缓存数据可能会丢失

时间:2020-09-17 17:25:07

标签: apollo-client

我正在使用Postgraphile为我生成Graphql模式。我正在使用Apollo Client 3来帮助查询/缓存。这是我的架构的相关形状:

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

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

nuggetsbuckets有许多关系。

当我尝试为任一存储桶的块创建新记录时,收到以下警告:

替换查询对象的块字段时,缓存数据可能会丢失。

要解决此问题(这不是Apollo Client中的错误),请为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 “}},.........

我注意到这两个的形状不同,并且它们应该相互匹配是有意义的,因此我在InMemoryCache模式中做到了这一点:

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

但是,这不能解决问题,导致从阿波罗查询返回data = undefined

这是我针对'createNugget'突变的update函数:

        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匹配。

0 个答案:

没有答案