未捕获的不变违规:存储错误

问题描述

我正在尝试使用在Go中编写的graphql api(以graph-gophers包为后端)和以Apollo graphql-client为前端的Vuejs应用程序来编写HackerNews克隆。相关的Github Repos Backend Frontend

我最近已经实现了订阅功能,而且看起来确实可以正常工作,但是每当我对链接进行投票时,我都会在javascript控制台中看到一个讨厌的错误,其全文如下。

Observable.js?5234:65 Uncaught Invariant Violation: Store error: the application attempted to write an object with no provided id but the store already contains an id of Link:10 for this object. The selectionSet that was trying to be written is:
{"kind":"Field","name":{"kind":"Name","value":"link"},"arguments":[],"directives":[],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","value":"votes"},"value":"id"},"directives":[]},{"kind":"Field","value":"user"},"value":"__typename"}}]}},"value":"__typename"}}]}}
    at new InvariantError (webpack-internal:///./node_modules/ts-invariant/lib/invariant.esm.js:16:28)
    at invariant (webpack-internal:///./node_modules/ts-invariant/lib/invariant.esm.js:28:15)
    at StoreWriter.writeFieldToStore (webpack-internal:///./node_modules/apollo-cache-inmemory/lib/bundle.esm.js:680:166)
    at eval (webpack-internal:///./node_modules/apollo-cache-inmemory/lib/bundle.esm.js:576:27)
    at Array.forEach (<anonymous>)
    at StoreWriter.writeSelectionSetToStore (webpack-internal:///./node_modules/apollo-cache-inmemory/lib/bundle.esm.js:567:33)
    at StoreWriter.writeFieldToStore (webpack-internal:///./node_modules/apollo-cache-inmemory/lib/bundle.esm.js:665:22)
    at eval (webpack-internal:///./node_modules/apollo-cache-inmemory/lib/bundle.esm.js:576:27)
    at Array.forEach (<anonymous>)
    at StoreWriter.writeSelectionSetToStore (webpack-internal:///./node_modules/apollo-cache-inmemory/lib/bundle.esm.js:567:33)
WriteError @ bundle.esm.js?d5b7:498
enhanceErrorWithDocument @ bundle.esm.js?d5b7:505
StoreWriter.writeResultToStore @ bundle.esm.js?d5b7:544
InMemoryCache.write @ bundle.esm.js?d5b7:875
eval @ bundle.esm.js?6445:1867
eval @ bundle.esm.js?6445:1867
InMemoryCache.performTransaction @ bundle.esm.js?d5b7:943
DataStore.markMutationResult @ bundle.esm.js?6445:1866
next @ bundle.esm.js?6445:1011
notifySubscription @ Observable.js?5234:135
onNotify @ Observable.js?5234:179
next @ Observable.js?5234:235
eval @ bundle.esm.js?6445:866
next @ bundle.esm.js?6445:866
notifySubscription @ Observable.js?5234:135
onNotify @ Observable.js?5234:179
next @ Observable.js?5234:235
eval @ bundle.esm.js?8322:76
setTimeout (async)
hostReportError @ Observable.js?5234:64
notifySubscription @ Observable.js?5234:149
onNotify @ Observable.js?5234:179
next @ Observable.js?5234:235
eval @ bundle.esm.js?6445:866
next @ bundle.esm.js?6445:866
notifySubscription @ Observable.js?5234:135
onNotify @ Observable.js?5234:179
next @ Observable.js?5234:235
eval @ bundle.esm.js?8322:76
Promise.then (async)
eval @ bundle.esm.js?8322:75
Subscription @ Observable.js?5234:197
subscribe @ Observable.js?5234:279
eval @ bundle.esm.js?6445:864
Subscription @ Observable.js?5234:197
subscribe @ Observable.js?5234:279
eval @ bundle.esm.js?6445:1001
eval @ bundle.esm.js?6445:998
step @ tslib.es6.js?4d3a:100
eval @ tslib.es6.js?4d3a:81
eval @ tslib.es6.js?4d3a:74
__awaiter @ tslib.es6.js?4d3a:70
QueryManager.mutate @ bundle.esm.js?6445:950
ApolloClient.mutate @ bundle.esm.js?6445:2016
mutate @ vue-apollo.esm.js?ebd5:1286
voteForLink @ LinkItem.vue?5bee:46
click @ LinkItem.vue?441e:18
invokeWithErrorHandling @ vue.esm.js?efeb:1863
invoker @ vue.esm.js?efeb:2188
original._wrapper @ vue.esm.js?efeb:7565

我已经进行了足够的调试,以确认我要添加到商店的所有内容都没有丢失任何ID。我不确定引起此错误的原因是什么。一切似乎正常,但我想知道为什么此错误不断抛出。

解决方法

我最终弄清楚了这一点。错误的原因是当发生upvote时更新商店时,我一直专注于graphql模式中的投票订阅,而问题实际上是在upvote突变中。作为架构一部分返回的链接缺少ID。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...