2017-10-22 31 views
6

Tôi đang đệ quy tải một cây được lưu trữ trong Firestore. Cây có ~ 79 nút.Lỗi trong onSnapshot: FirebaseError: [code = đối số không hợp lệ]: giao dịch đã đóng

Rất thỉnh thoảng tôi gặp lỗi này (khoảng một trong mười lần tải toàn bộ cây).

Chỉnh sửa: mã: https://github.com/karol-depka/OrYoL

Edit: ví dụ triển khai: https://oryol.karoldepka.com/tree (xin lỗi, không có plunker cho bây giờ, chỉ cần này)

chi tiết dưới đây.

phiên bản căn cứ hỏa lực trong package.json: 4.5.0

Câu hỏi:

tôi có thể nhận được thông tin nhiều hơn tài liệu cơ bản này https://firebase.google.com/docs/reference/js/firebase.FirebaseError ở đâu?

Nguồn của sự cố là gì và cách khắc phục sự cố?

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) 

Mã:

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

Chỉnh sửa: một lỗi được phát hiện, bằng cách chạy mã nhiều lần:

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 

Edit: cập nhật căn cứ hỏa lực để 4.6.0, vấn đề đã xảy ra 3 lần:

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) 

Chỉnh sửa: ngay cả khi lỗi xảy ra, cây dường như vẫn tiếp tục tải.

Edit: một phiên bản khác của lỗi, với code=aborted (sau khi nâng cấp firebase để 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() 
+0

Tôi đã gặp sự cố tương tự với SDK iOS: https://stackoverflow.com/questions/46710371/firebase-firestore-ios-document-snapshot-listener-error-the-referenced-trans – Saul

+0

bất kỳ tin tức nào về điều này vấn đề ? –

Trả lời

1

Tôi có nhiều hơn hoặc ít hơn như nhau và nó là ngẫu nhiên khi nó hoạt động mà không làm. Tôi không sử dụng ảnh chụp, nhưng 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) 

Đối với tôi đó là hòa bình của mã đó khiêu khích các lỗi:

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

mỗi mục trong mục được sử dụng để trả về một lựa chọn duy nhất từ ​​FireStore.

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

Tôi không có ý định chiếm đoạt chuỗi của bạn, nhưng tôi cảm thấy điều này rất có liên quan. Nếu tôi thay đổi forkJoin thành

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

thì nó hoạt động, vì vậy tôi đoán đó là một số loại quá tải truy vấn.

+0

Xin chào. Cảm ơn bạn đã quan sát. Bất cứ khi nào chúng tôi có những phát hiện mới, hãy trao đổi quan sát.Bây giờ tôi bỏ qua lỗi và mọi thứ dường như hoạt động tốt. Ngoại trừ có thể trong một trường hợp cái cuối cùng/vài nút cây đã được thêm vài giây sau khi "mọi thứ dường như được tải xong", nhưng tôi không chắc chắn. Tôi sẽ mở mắt ra. Hy vọng rằng một số nhân viên của Firebase sẽ bình luận/trả lời, như Frank Van Puffeln, để làm sáng tỏ ... – KarolDepka

+0

Bạn đang sử dụng AngularFire, phải không? – KarolDepka

+0

Có, angularfire2 và tôi đã thực hiện dự án vài ngày trước, vì vậy các phiên bản phải là mới nhất. Điều này phá vỡ hoàn toàn ứng dụng của tôi, vì tôi cần phải có khả năng gửi nhiều truy vấn cùng một lúc, vì vậy tôi đoán tôi sẽ quay trở lại MongoDB. –

Các vấn đề liên quan