我正在使用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)
如果可能,我想知道错误和解决方案的可能原因。
答案 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-inmemory
到apollo-cache-hermes
的转变帮助揭示了这一点。
我曾尝试过Hermes,希望减轻这种使用,但不幸的是,它无法像apollo-cache-inmemory
一样更新缓存。不过,令人好奇的是,与apollo-cache-inmemory
不同,爱马仕显示的是非常友好的用户友好信息。这使我想到一个启示,当高速缓存试图存储已使用ID和ID在高速缓存中的对象类型时,它确实遇到了这个问题,但是缺少新的对象类型。因此,如果在查询字段时保持一致,apollo-cache-inmemory
应该可以正常工作。如果您为某个对象类型在任何地方都省略了id
字段,那么它将很高兴地工作。如果您在任何地方都使用id
字段,它将正常工作。一旦您混合使用ID和不使用ID的查询,缓存就会被此可怕的错误消息炸毁。
这不是bug,它可以按预期工作,只是在任何地方都没有记录,请参见此spec。 我真的希望阿波罗在某处记录了此约束。