错误:网络错误:将结果写入存储以进行查询时出错(Apollo Client)

时间:2017-06-07 05:05:42

标签: javascript graphql react-apollo apollo-client

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

我为客户端创建了一个自定义NetworkInterface,帮助我制作定制服务器请求(默认情况下,ApolloClient对我们指定的URL进行POST调用)。网络接口只需要有一个query()方法,其中我们返回表单Promise<ExecutionResult>的结果的promise。

我能够进行服务器调用并获取所请求的数据,但仍然会收到以下错误。

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)

如果可能,我想知道错误和解决方案的可能原因。

4 个答案:

答案 0 :(得分:11)

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

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

答案 1 :(得分:2)

我有一个类似的错误。 我通过向查询添加id来解决。 例如,我当前的查询是

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

我的新查询是

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

答案 2 :(得分:1)

我有一个类似的问题。

也许您的应用尝试使用错误的商店地址向商店写入(网络响应数据)?

解决我的问题

我在向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商店“地址”似乎使用 * 字符串化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可能会避免这个讨厌的错误(未验证的

更多信息

我的问题可能只是切线相关,所以如果这没有帮助我有两个建议:

首先,将这3行添加到node_modules/apollo-cache-inmemory/lib/writeToStore.js,以便在“记录”为空时提醒您。 然后调查_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;
    +}

第二,确保使用您期望的变量保存所有查询,突变和手动商店更新

答案 3 :(得分:0)

在我们的应用程序的各个部分中进行了数月的对抗之后,我终于找到了导致此问题的原因。从apollo-cache-inmemoryapollo-cache-hermes的转变帮助揭示了这一点。

我曾尝试过Hermes,希望减轻这种使用,但不幸的是,它无法像apollo-cache-inmemory一样更新缓存。不过,令人好奇的是,与apollo-cache-inmemory不同,爱马仕显示的是非常友好的用户友好信息。这使我想到一个启示,当高速缓存试图存储已使用ID和ID在高速缓存中的对象类型时,它确实遇到了这个问题,但是缺少新的对象类型。因此,如果在查询字段时保持一致,apollo-cache-inmemory应该可以正常工作。如果您为某个对象类型在任何地方都省略了id字段,那么它将很高兴地工作。如果您在任何地方都使用id字段,它将正常工作。一旦您混合使用ID和不使用ID的查询,缓存就会被此可怕的错误消息炸毁。

这不是bug,它可以按预期工作,只是在任何地方都没有记录,请参见此spec。 我真的希望阿波罗在某处记录了此约束。