Error: Network error: Error writing result to store for query (Apollo Client)

Error: Network error: Error writing result to store for query (Apollo Client)

我正在使用 Apollo Client 创建一个应用程序来使用 Graphql 查询我的服务器。我有一个 python 服务器,我在该服务器上执行我的 graphql 查询,该查询从数据库中获取数据,然后 return 将其返回给客户端。

我为客户端创建了一个自定义的 NetworkInterface,它可以帮助我发出自定义的服务器请求(默认情况下,ApolloClient 对我们指定的 URL 进行 POST 调用)。网络接口只需要有一个 query() 方法,其中我们 return 对形式 Promise<ExecutionResult> 的结果的承诺。

我可以调用服务器并获取请求的数据,但仍然出现以下错误。

Error: Network error: Error writing result to store for query 
{
   query something{
      row{
         data
      }
   }
}
Cannot read property 'row' of undefined
    at new ApolloError (ApolloError.js:32)
    at ObservableQuery.currentResult (ObservableQuery.js:76)
    at GraphQL.dataForChild (react-apollo.browser.umd.js:410)
    at GraphQL.render (react-apollo.browser.umd.js:448)
    at ReactCompositeComponent.js:796
    at measureLifeCyclePerf (ReactCompositeComponent.js:75)
    at ReactCompositeComponentWrapper._renderValidatedComponentWithoutOwnerOrContext (ReactCompositeComponent.js:795)
    at ReactCompositeComponentWrapper._renderValidatedComponent (ReactCompositeComponent.js:822)
    at ReactCompositeComponentWrapper._updateRenderedComponent (ReactCompositeComponent.js:746)
    at ReactCompositeComponentWrapper._performComponentUpdate (ReactCompositeComponent.js:724)
    at ReactCompositeComponentWrapper.updateComponent (ReactCompositeComponent.js:645)
    at ReactCompositeComponentWrapper.performUpdateIfNecessary (ReactCompositeComponent.js:561)
    at Object.performUpdateIfNecessary (ReactReconciler.js:157)
    at runBatchedUpdates (ReactUpdates.js:150)
    at ReactReconcileTransaction.perform (Transaction.js:140)
    at ReactUpdatesFlushTransaction.perform (Transaction.js:140)
    at ReactUpdatesFlushTransaction.perform (ReactUpdates.js:89)
    at Object.flushBatchedUpdates (ReactUpdates.js:172)
    at ReactDefaultBatchingStrategyTransaction.closeAll (Transaction.js:206)
    at ReactDefaultBatchingStrategyTransaction.perform (Transaction.js:153)
    at Object.batchedUpdates (ReactDefaultBatchingStrategy.js:62)
    at Object.enqueueUpdate (ReactUpdates.js:200)

我想知道错误的可能原因和解决方法

我遇到了类似的问题。

也许您的应用试图将(网络响应数据)写入具有错误商店地址的商店?

我的问题的解决方案

我在将 player 添加到 team 后更新商店:

// Apollo option object for `mutation AddPlayer`
update: (store, response) => {
  const addr = { query: gql(QUERY_TEAM), variables: { _id } };
  const data = store.readQuery(addr);
  stored.teams.players.push(response.data.player));
  store.writeQuery({...addr, data});
}

我开始遇到上面类似的错误(我使用的是 Apollo 2.0.2)

深入商店后,我意识到我的 QUERY_TEAM 请求是用一个变量 meta 默认为 null 提出的。 store "address" 似乎使用 *stringified addr 来识别记录。所以我更改了上面的代码以模仿包含 null:

// Apollo option object for `mutation AddPlayer`
update: (store, response) => {
  const addr = { query: gql(QUERY_TEAM), variables: { _id, meta: null } };
  const data = store.readQuery(addr);
  data.teams.players.push(response.data.player));
  store.writeQuery({...addr, data});
}

这解决了我的问题。

* 默认为 undefined 而不是 null 可能会避免这个讨厌的错误 (unverified)

更多信息

我的问题可能只是无关紧要,所以如果这没有帮助,我有两条建议:

首先,将这 3 行添加到 node_modules/apollo-cache-inmemory/lib/writeToStore.js 以在 "record" 为空时提醒您。 然后调查 _a 以了解问题所在。

exports.writeResultToStore = writeResultToStore;
function writeSelectionSetToStore(_a) {

    var result = _a.result, dataId = _a.dataId, selectionSet = _a.selectionSet, context = _a.context;
    var variables = context.variables, store = context.store, fragmentMap = context.fragmentMap;

    +if (typeof result === 'undefined') {
    +    debugger;
    +}

其次,确保所有查询、变更和手动存储更新都保存了您期望的变量

我有类似的错误。 我通过在查询中添加 id 来解决这个问题。 例如,我当前的查询是

query  {
  service:me {
    productServices {
      id
      title
    }
  }
}

我的新查询是

query  {
  service:me {
    id // <-------
    productServices {
      id
      title
    }
  }
}

在我们的应用程序的各个部分与它斗争了几个月后,我终于找到了导致这个问题的原因。有助于阐明它的是从 apollo-cache-inmemory 切换到 apollo-cache-hermes

我尝试用 Hermes 来缓解这个问题,但不幸的是它无法像 apollo-cache-inmemory 一样更新缓存。奇怪的是,与 apollo-cache-inmemory 不同,hermes 显示了一个非常友好的用户友好消息。这让我发现,当缓存试图存储一个已经存在于缓存中且具有 ID 的对象类型时,缓存确实遇到了这个问题,但新的对象类型却缺少它。因此,如果您在查询字段时一丝不苟地保持一致,apollo-cache-inmemory 应该可以正常工作。如果您在某个对象类型的任何地方都省略 id 字段,它将很高兴地工作。如果你在任何地方都使用 id 字段,它将正常工作。一旦您混合使用和不使用 id 的查询,缓存就会因这个可怕的错误消息而崩溃。

这不是 bug-it 的预期工作,它甚至记录在此处:https://www.apollographql.com/docs/react/caching/cache-configuration/#default-identifiers

2020 更新:Apollo has since removed this "feature" from the cache,因此在 apollo-client 3 及更高版本中不应再抛出此错误。

我们需要包括 id, 否则会导致上述错误。

{
   query something {
      id
      row {
         id
         data
      }
   }
}

解决方法是 1. 当缺少 id 时发生,第二个是当您有相同的查询并交替点击它们时发生。 例如,如果您有像狗和猫这样的查询。

query dog(){id, name}
query cat(){id, name }

这两个查询是相同的,只是它们的 header 不同,在此期间,此类问题即将出现。目前我正在获取具有不同状态的相同查询并收到此错误并且在寻找解决方案时迷路了。

对我来说,在查询中添加“__typename”很有帮助。