ApolloClient:optimisticResponse 在更新期间变为“未定义”

Posted

技术标签:

【中文标题】ApolloClient:optimisticResponse 在更新期间变为“未定义”【英文标题】:ApolloClient: optimisticResponse becomes "undefined" during update 【发布时间】:2020-07-01 13:49:04 【问题描述】:

我正在尝试使用带有 vue-apollo 的 ApolloClient 在突变中执行 optimisticResponse

突变本身工作正常 - 服务器已更新,当我刷新页面时,插入已成功出现。但是,一旦update() 函数第二次运行,写入查询的optimisticResponse 将变为“未定义”,并带有来自服务器的“真实”响应。

我的变异代码如下所示:

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"
      
    ,
  ,
)

请注意,现在我在update() 中第二次调用readQuery 以进行调试。

update() 的第一次运行中readQuery 的第二次调用(即在插入optimisticResponse 之后,它看起来像这样: ...所以一切看起来都很好,那里的字段与缓存中已经存在的数据相匹配,等等。

但是,当update() 第二次运行(处理来自服务器的结果)时,我们的optimisticResponse 是“那里”,但作为undefined

这会产生错误TypeError: Cannot read property '__typename' of undefined

老实说,我不确定在生命周期的这个阶段会发生什么……optimisticResult 是否仍然存在?或者它应该已经被删除了?在任何一种情况下,我都确定它不应该存在,undefined 因为这是导致错误的原因。

【问题讨论】:

我怀疑这可能与直接改变缓存有关。我会尝试store.writeQuery( query: GET_PROJECTS, data: rc_todos: [...data.rc_todos, newTodo] )。这将创建一个新数组,而不是改变从缓存中获得的数组。 我刚试了一下,可惜没有成功。 可能只是 apollo-client 的一个错误,尽管我之前没有看到过乐观更新的问题。您可能想尝试更新到最新版本(现在可以使用 3.0),看看是否有帮助。 【参考方案1】:

结果证明这是一个愚蠢的错误——服务器返回的突变的真正响应与它在客户端中的设置方式不同。

我在问题中截屏的部分实际上是预期的行为 - 它将先前添加的 optimisticResponse 设置为 undefined 以便在“真实”数据可用时将其删除。

【讨论】:

以上是关于ApolloClient:optimisticResponse 在更新期间变为“未定义”的主要内容,如果未能解决你的问题,请参考以下文章

ApolloClient 客户端的类型

ApolloClient:optimisticResponse 在更新期间变为“未定义”

ApolloLink 的 ApolloClient 类型错误

如何将 fetcher 传递给 ApolloClient()?

如何使用 ApolloClient 记录 HTTP 请求和响应

在 React 中使用 ApolloClient 订阅 AppSync