2017-10-22 20 views
6

Firestoreに格納されているツリーを再帰的にロードしています。ツリーには〜79個のノードがあります。onSnapshotのエラー:FirebaseError:[code = invalid-argument]:トランザクションが閉じました

非常に時々、私はこのエラーが発生しています(フルツリーロードの10分の1)。

編集:コード:https://github.com/karol-depka/OrYoL

編集:展開例:https://oryol.karoldepka.com/tree(今のところ申し訳ありませんが、plunker、ちょうどこの)以下

詳細。

package.jsonでFirebaseバージョン:4.5.0

質問:

が、私はこの基本的な文書https://firebase.google.com/docs/reference/js/firebase.FirebaseError よりも多くの情報を得ることができますか?

問題の原因と解決方法は何ですか?

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); 
    } 
    }) 
} 

編集:

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回起こった:

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) 

編集:エラーが発生しても、ツリーはロードを続けるようです。

編集:エラーの別のバージョン、code=abortedと(4.6.0firebaseをアップグレードした後):

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() 
+0

iOS SDKで同様の問題が発生しました:https://stackoverflow.com/questions/46710371/firebase-firestore-ios-document-snapshot-listener-error-the-referenced-trans – Saul

+0

これに関するニュース問題 ? –

答えて

1

私は多かれ少なかれ同じを持っており、それが動作しないとき、それはランダムです。私は、スナップショットを使用しませんが、私にとっては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) 

は、それがエラーを誘発するコードのこの平和だ:

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

エントリ内の各エントリはfirestoreから単一のピックを返すために使用されます。

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

私はあなたのスレッドをハイジャックするという意味ではありませんが、私は、これは非常に関連性があると感じ。私は

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

にforkJoinを変更する場合、それは動作しますので、私はそれがクエリの過負荷のいくつかの種類であると思います。

+0

こんにちは。あなたの観察に感謝します。新しい発見があるときはいつでも、観察を交換しましょう。今のところ、私はエラーを無視しているし、ものは正常に動作するようです。 1つのケースを除いて、「すべてが明らかに読み込まれました」の後、最後の1/2,3のツリーノードが数秒で追加されましたが、わかりません。私の目を開いたままにします。うまくいけば、いくつかのFirebaseのスタッフがFrank Van Puffelnのようにいくつかの光を放つようにコメント/返信してくれることを願っています。 – KarolDepka

+0

あなたはAngularFireを使用していますか? – KarolDepka

+0

はい、angularfire2、私は数日前にプロジェクトを作ったので、最新版でなければなりません。これは私のアプリケーションを完全に破るので、一度に複数のクエリを送信できる必要があるので、私はMongoDB程度に戻ると思います。 –

関連する問題