onSnapshot中的错误:FirebaseError:[code = invalid-argument]:事务已关闭 [英] Error in onSnapshot: FirebaseError: [code=invalid-argument]: transaction closed

查看:68
本文介绍了onSnapshot中的错误:FirebaseError:[code = invalid-argument]:事务已关闭的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在递归地加载存储在Firestore中的树.这棵树有约79个节点.

I'm recursively loading a tree stored in Firestore. The tree has ~79 nodes.

偶尔我会遇到此错误(大约十个全树负载中的一个).

Very occasionally I'm getting this error (about one in ten full-tree loads).

代码: https://github.com/karol-depka/OrYoL

部署的示例: https://oryol.karoldepka.com/tree (对不起,暂时没有,现在就这样)

the example deployed: https://oryol.karoldepka.com/tree (sorry, no plunker for now, just this)

下面的详细信息.

Firebase版本: 4.5.0

Firebase version in package.json: 4.5.0

问题:

在哪里可以获取比此基本文档更多的信息 https://firebase.google.com/docs/reference/js/firebase.FirebaseError ?

Where can I get more info than this basic documentation https://firebase.google.com/docs/reference/js/firebase.FirebaseError ?

问题的根源是什么以及如何解决?

What is the source of the problem and how to fix it?

3VM724:27 Uncaught Error in onSnapshot: Error: transaction closed
at new FirestoreError (error.js:164)
at JsonProtoSerializer.webpackJsonp.../../../../firebase/firestore/remote/serializer.js.JsonProtoSerializer.fromRpcStatus (serializer.js:126)
at JsonProtoSerializer.webpackJsonp.../../../../firebase/firestore/remote/serializer.js.JsonProtoSerializer.fromWatchChange (serializer.js:517)
at PersistentListenStream.webpackJsonp.../../../../firebase/firestore/remote/persistent_stream.js.PersistentListenStream.onMessage (persistent_stream.js:334)
at persistent_stream.js:270
at persistent_stream.js:247
at async_queue.js:81
at ZoneDelegate.webpackJsonp.../../../../zone.js/dist/zone.js.ZoneDelegate.invoke (zone.js:392)
at Object.onInvoke (core.es5.js:3890)
at ZoneDelegate.webpackJsonp.../../../../zone.js/dist/zone.js.ZoneDelegate.invoke (zone.js:391)

代码:

private processNodeEvents(nestLevel: number, snapshot: any, parents, listener: DbTreeListener) {
  const serviceThis = this
  snapshot.docChanges.forEach(function(change) {
    let data = change.doc.data()
    if (change.type === 'added') {
      const parentsPath = serviceThis.nodesPath(parents)
      console.log('node: ', nestLevel, parentsPath, data);
      serviceThis.pendingListeners ++
      data.node.onSnapshot(targetNodeDoc => {
        serviceThis.pendingListeners --
        listener.onNodeAdded(
          new NodeAddEvent(parentsPath, parentsPath[parentsPath.length - 1], targetNodeDoc, targetNodeDoc.id,
            serviceThis.pendingListeners))
        console.log('target node:', nestLevel, targetNodeDoc)
        console.log('target node title:', nestLevel, targetNodeDoc.data().title)

        const subCollection = targetNodeDoc.ref.collection('subNodes')
        console.log('subColl:', subCollection)
        subCollection.onSnapshot((subSnap: QuerySnapshot) => {
          const newParents = parents.slice(0)
          newParents.push(targetNodeDoc.ref)
          serviceThis.processNodeEvents(nestLevel + 1, subSnap, newParents, listener)
        })
      })
      // console.log('root node ref: ', targetNode);
    }
    if (change.type === 'modified') {
      console.log('Modified city: ', data);
    }
    if (change.type === 'removed') {
      console.log('Removed city: ', data);
    }
  })
}

通过多次运行代码发现了另一个错误:

another error discovered, by running the code multiple times:

VM3343:27 Uncaught Error in onSnapshot: Error: The referenced transaction has expired or is no longer valid.
at new FirestoreError (error.js:164)
at JsonProtoSerializer.webpackJsonp.../../../../firebase/firestore/remote/serializer.js.JsonProtoSerializer.fromRpcStatus (serializer.js:126)
at JsonProtoSerializer.webpackJsonp.../../../../firebase/firestore/remote/serializer.js.JsonProtoSerializer.fromWatchChange (serializer.js:517)
at PersistentListenStream.webpackJsonp.../../../../firebase/firestore/remote/persistent_stream.js.PersistentListenStream.onMessage (persistent_stream.js:334)
at persistent_stream.js:270
at persistent_stream.js:247
at async_queue.js:81
at ZoneDelegate.webpackJsonp.../../../../zone.js/dist/zone.js.ZoneDelegate.invoke (zone.js:392)
at Object.onInvoke (core.es5.js:3890)
at ZoneDelegate.webpackJsonp.../../../../zone.js/dist/zone.js.ZoneDelegate.invoke (zone.js:391)
window.console.error @ VM3343:27

将Firebase更新为 4.6.0 ,问题发生了3次:

update firebase to 4.6.0, problem happened 3 times:

Uncaught Error in onSnapshot: Error: transaction closed
  at new FirestoreError (error.js:149)
  at JsonProtoSerializer.webpackJsonp.../../../../@firebase/firestore/dist/esm/src/remote/serializer.js.JsonProtoSerializer.fromRpcStatus (serializer.js:93)
  at JsonProtoSerializer.webpackJsonp.../../../../@firebase/firestore/dist/esm/src/remote/serializer.js.JsonProtoSerializer.fromWatchChange (serializer.js:536)
  at PersistentListenStream.webpackJsonp.../../../../@firebase/firestore/dist/esm/src/remote/persistent_stream.js.PersistentListenStream.onMessage (persistent_stream.js:309)
  at persistent_stream.js:246
  at persistent_stream.js:222
  at async_queue.js:62
  at ZoneDelegate.webpackJsonp.../../../../zone.js/dist/zone.js.ZoneDelegate.invoke (zone.js:392)
  at Object.onInvoke (core.es5.js:3890)
  at ZoneDelegate.webpackJsonp.../../../../zone.js/dist/zone.js.ZoneDelegate.invoke (zone.js:391)

即使发生错误,树也似乎会继续加载.

even if the error happens, the tree seems to continue loading.

错误的另一个版本,具有 code = aborted (在将 firebase 升级到 4.6.0 之后):

another version of the error, with code=aborted (after upgrading firebase to 4.6.0):

Error in onSnapshot: FirebaseError: [code=aborted]: The referenced transaction has expired or is no longer valid.
/vendor.bundle.js:18588 errHandler()
/vendor.bundle.js:33367
/polyfills.bundle.js:2970 ZoneDelegate.webpackJsonp.../../../../zone.js/dist/zone.js.ZoneDelegate.invokeTask()
/vendor.bundle.js:107276 Object.onInvokeTask()
/polyfills.bundle.js:2969 ZoneDelegate.webpackJsonp.../../../../zone.js/dist/zone.js.ZoneDelegate.invokeTask()
/polyfills.bundle.js:2737 Zone.webpackJsonp.../../../../zone.js/dist/zone.js.Zone.runTask()
/polyfills.bundle.js:3044 webpackJsonp.../../../../zone.js/dist/zone.js.ZoneTask.invokeTask()
/polyfills.bundle.js:3033 ZoneTask.invoke()

推荐答案

我或多或少都具有相同的含义,当它起作用时,它是随机的,而不起作用.我不使用快照,但使用valueChanges

I have more or less the same and it is random when it works and don't. I don't use snapshot, but valueChanges

ERROR Error: transaction closed
at new FirestoreError (error.js:149)
at JsonProtoSerializer.webpackJsonp.../../../../@firebase/firestore/dist/esm/src/remote/serializer.js.JsonProtoSerializer.fromRpcStatus (serializer.js:93)
at JsonProtoSerializer.webpackJsonp.../../../../@firebase/firestore/dist/esm/src/remote/serializer.js.JsonProtoSerializer.fromWatchChange (serializer.js:536)
at PersistentListenStream.webpackJsonp.../../../../@firebase/firestore/dist/esm/src/remote/persistent_stream.js.PersistentListenStream.onMessage (persistent_stream.js:309)
at persistent_stream.js:246
at persistent_stream.js:222
at async_queue.js:62
at ZoneDelegate.webpackJsonp.../../../../zone.js/dist/zone.js.ZoneDelegate.invoke (zone.js:392)
at Object.onInvoke (core.es5.js:3890)
at ZoneDelegate.webpackJsonp.../../../../zone.js/dist/zone.js.ZoneDelegate.invoke (zone.js:391)

对我来说,正是这种和平的代码引发了错误:

For me it's this peace of code that provokes the error:

return Observable.forkJoin(entries.map(entry => {
  return this.getPick(entry)
}))

条目中的每个条目用于从Firestore返回一个选择.

each entry in entries is used to return a single pick from firestore.

  private getPick(entryId: number) {
     return this.afs.collection<Pick>('entry/' + entryId + '/event/' + '9/' + 'picks', ref => ref.where('is_captain','==',true))
     .valueChanges()

我并不是要劫持您的线程,但是我觉得这很重要.如果我将forkJoin更改为

I don't mean to hijack your thread, but I feel this is very relevant. If I change the forkJoin to

Observable.forkJoin(entries.slice(0,20)...

然后它起作用了,所以我猜想它是某种查询的重载.

then it works, so I guess it is some kind of overload of queries.

这篇关于onSnapshot中的错误:FirebaseError:[code = invalid-argument]:事务已关闭的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆