ApolloClient: optimisticResponse становится «неопределенным» во время обновления - PullRequest
1 голос
/ 20 марта 2020

Я пытаюсь сделать optimisticResponse в мутации с ApolloClient с vue -apollo.

Сама мутация работает нормально - сервер обновляется, и когда я обновляю sh, страница, вставка успешно появилась. Тем не менее, optimisticResponse, который записывается в запрос, становится «неопределенным» после повторного запуска функции update() с «реальным» ответом от сервера.

Мой код мутации выглядит следующим образом:

this.$apollo.mutate({
  mutation: UPSERT_ITEMS,
  variables: {
    todoInput: [todoInput]
  },

  update: (store, result) => {
    const upsertTodos = result.data!.upsertTodos
    const newTodo = upsertTodos.todo
    const data = store.readQuery<QueryResult>({ query: GET_PROJECTS })
    console.log("Results from the cache:", data);
    data!.rc_todos.push(newTodo)
    console.log("after that push, data looks like...", data)
    store.writeQuery({ query: GET_PROJECTS, data })

    // re-reading the query for debugging purposes:
    const sameData = store.readQuery<QueryResult>({ query: GET_PROJECTS })
    console.log("New results from the cache:", sameData)
  },
  optimisticResponse: {
    __typename: "Mutation",
    upsertTodos: {
      __typename: "InsertedTodo",
      id: 1,
      todo_id: 1,
      todo: {
        id: 1,
        label: nodeTitle,
        children: [],
        __typename: "rc_todos"
      }
    },
  },
})

Обратите внимание, что сейчас я вызываю readQuery второй раз в update() для целей отладки.

Во втором вызове readQuery при первом запуске update() (то есть сразу после вставки optimisticResponse это выглядит так: enter image description here ... так что все выглядит хорошо, поля там совпадают данные, которые уже были в кеше, и т. д. c.

Но, когда update() запускается во второй раз (для обработки результатов с сервера), наш optimisticResponse находится "там", но как undefined: enter image description here

Это приводит к ошибке TypeError: Cannot read property '__typename' of undefined.

Если честно, я не уверен, что должно происходить в этот момент в жизненный цикл ... должен ли OptimisticResult все еще быть там? Или он уже должен быть удален? В любом случае, я уверен, что его там не должно быть и undefined, так как это вызывает ошибку.

1 Ответ

0 голосов
/ 20 марта 2020

Это оказалось глупой ошибкой - реальный ответ от мутации, которую возвращал сервер, отличался от того, как он был настроен в клиенте.

Часть, которую я сделал скриншот в моем вопросе, на самом деле является предполагаемым поведением - она ​​устанавливает ранее добавленное optimisticResponse в undefined, чтобы удалить его, как только "реальные" данные станут доступны.

...