Как обновить кеш 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
    }
  }
}

Я думал, что мне нужно передать только переменную идентификатора пользователя. Однако это не работает. Я всегда получаю

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
        })
      }
    })

person Jakub Juszczak    schedule 26.02.2018    source источник


Ответы (1)


Когда вы используете readQuery или writeQuery, вы должны использовать то же имя переменной. Так что замените

  variables: { id: ownerId }

С участием

  variables: { ownerId }

Кроме того, причина, по которой вы получаете исключение, заключается в том, что readQuery генерирует исключение, если данных нет в магазине. Это происходит перед первым использованием writeQuery (или получения данных с помощью другого запроса).

Вы можете записать в магазин некоторые значения по умолчанию, прежде чем вызывать эту мутацию.

Вы также можете использовать readFragment, который возвращает значение null, вместо того, чтобы генерировать исключение. Но это потребует дополнительных изменений в вашем коде.

person Tal Z    schedule 26.02.2018