#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
.