Как обновить кеш apollo после мутации (запрос с фильтром)
Я довольно новичок в GraphQL. Я использую graph.cool в проекте Vue.js с Apollo.
- Я сейчас использую кеш в памяти.
- Ранее у меня был простой запрос 'allPosts'.
- И после создания нового я использовал хук update() и readQuery() + writeQuery()
Однако я хочу, чтобы вошедшие в систему пользователи могли видеть только свои посты. Поэтому я изменил запрос с помощью фильтра.
query userStreams ($ownerId: ID!) {
allStreams(filter: {
owner: {
id: $ownerId
}
}) {
id
name
url
progress
duration
watched
owner {
id
}
}
}
Я думал, что мне нужно только передать переменную userid. Однако это не работает. Я всегда получаю
Error: Can't find field allStreams({"filter":{"owner":{}}}) on object (ROOT_QUERY) undefined.
this.$apollo.mutate({
mutation: CREATE_STREAM,
variables: {
name,
url,
ownerId
},
update: (store, { data: { createStream } }) => {
const data = store.readQuery({
query: USERSTREAMS,
variables: {
id: ownerId
}
})
data.allStreams.push(createStream)
store.writeQuery({
query: USER_STREAMS,
variables: {
id: ownerId
},
data
})
}
})
1 ответ
Когда вы используете readQuery или writeQuery, вы должны использовать одно и то же имя переменной. Так замени
variables: { id: ownerId }
С
variables: { ownerId }
Кроме того, причина, по которой вы получаете исключение, заключается в том, что readQuery генерирует исключение, если данные не находятся в хранилище. Это происходит до того, как вы в первый раз используете writeQuery (или получаете данные с помощью другого запроса).
Вы можете записать некоторые значения по умолчанию в хранилище перед вызовом этой мутации.
Вы также можете использовать readFragment, который возвращает ноль, а не генерировать исключение. Но это потребует больше изменений в вашем коде.