我正在使用Postgraphile为我生成Graphql模式。我正在使用Apollo Client 3来帮助查询/缓存。这是我的架构的相关形状:
Query -> buckets: BucketsConnection -> edges: BucketsEdge -> node: Bucket
Query -> nuggets: NuggetsConnection -> edges: NuggetsEdge -> node: Nugget
nuggets
和buckets
有许多关系。
当我尝试为任一存储桶的块创建新记录时,收到以下警告:
替换查询对象的块字段时,缓存数据可能会丢失。
要解决此问题(这不是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
匹配。