生产环境Firebase项目升级依赖后触发重试超限等错误
Firebase依赖升级后Firestore监听报错问题
依赖升级情况
- firebase-admin:从
^9.2.0升级到^11.5.0 - firebase-functions:从
^3.21.2升级到^4.2.0
报错信息
主报错
Error: Exceeded maximum number of retries allowed. at QueryWatch.<anonymous> (/workspace/app/orders/makeOrderDone.function.js:179:27) at QueryWatch.closeStream (/workspace/node_modules/@google-cloud/firestore/build/src/watch.js:226:18) at /workspace/node_modules/@google-cloud/firestore/build/src/watch.js:335:18 at runMicrotasks (<anonymous>) at processTicksAndRejections (internal/process/task_queues.js:95:5)
前置报错
Error: A backoff operation is already in progress. at QueryWatch.<anonymous> (/workspace/app/orders/makeOrderDone.function.js:169:35) at QueryWatch.closeStream (/workspace/node_modules/@google-cloud/firestore/build/src/watch.js:226:18) at /workspace/node_modules/@google-cloud/firestore/build/src/watch.js:335:18 at runMicrotasks (<anonymous>) at processTicksAndRejections (internal/process/task_queues.js:95:5) at runNextTicks (internal/process/task_queues.js:64:3) at processTimers (internal/timers.js:497:9)
补充背景
本次升级是为了使用preferRest选项,目前已禁用该选项,但报错仍未消失。
相关代码片段
db .collection("Orders") .doc(orderId) .collection("Order_Items") .where("order_status_val", "==", 1) .onSnapshot(() => { // 内部包含业务逻辑及另一个嵌套的onSnapshot监听 })
问题分析与解决建议
嵌套监听的资源泄漏风险:代码中存在嵌套的
onSnapshot监听,新版本Firestore SDK对监听生命周期管理更严格,若外层监听触发频繁,易导致内层监听未正确销毁,引发重试冲突。- 在外层监听回调中,先销毁之前创建的内层监听,再生成新的监听实例
- 使用
unsubscribe方法手动管理监听生命周期,避免重复注册
跨版本SDK兼容性问题:从v9到v11的跨版本升级,Firestore底层监听机制(如重试逻辑、连接管理)有变更,原有代码模式未适配。
- 尝试逐步升级版本,先过渡到v10.x版本,排查是否为特定版本引入的问题
- 检查项目其他依赖是否与新版本Firebase SDK存在冲突,比如
@google-cloud/firestore的隐式版本差异
监听重试逻辑冲突:报错提示同一监听实例的重试操作并发冲突,新版本SDK重试策略优化后,原有重复注册监听的行为触发了报错。
- 确保每个
onSnapshot监听仅被调用一次,避免同一查询重复注册监听 - 为监听添加错误处理回调,错误发生时主动销毁监听,按需重新创建
- 确保每个
内容的提问来源于stack exchange,提问作者Omar Dulaimi
相关产品推荐
相关产品推荐

