Firestore set/add方法无响应且Promise永不resolved,读操作正常求助
问题原因
- Firestore 离线持久化同步卡住
如果你的项目开启了Firestore离线持久化功能,写操作会先缓存在本地,返回的Promise需要等待服务端确认同步成功才会resolve。如果客户端网络异常、或者同步逻辑卡住,就会出现Promise一直pending、既不触发then也不触发catch的情况,自然也看不到控制台的数据变更。 - 全局逻辑吞掉了Promise回调
如果项目中配置了全局的Promise异常拦截(比如unhandledrejection事件监听)、或者第三方中间件/框架拦截了Firestore的请求回调,也会导致你的then/catch逻辑不执行。 - 浏览器扩展/网络规则拦截了写请求
部分广告拦截、隐私防护类的浏览器扩展,或者本地网络的防火墙规则,可能会放行Firestore的读请求,但拦截写请求,导致请求发不出去也没有错误返回。 - 旧版本Firebase SDK存在已知bug
部分较低版本的Firebase Web SDK存在写操作Promise不触发回调的已知问题。
解决方案
- 验证并处理离线持久化问题
检查Firebase初始化代码中是否调用了enablePersistence(),临时注释该配置后重试写操作:- 如果不需要离线使用能力,直接关闭持久化即可解决问题
- 如果需要保留离线能力,不要依赖写操作的Promise回调,改用
onSnapshot()监听文档变更,本地写入完成就会触发回调,无需等待服务端同步
- 排查全局拦截逻辑
临时注释所有全局Promise拦截、请求拦截相关的代码,确认回调是否可以正常触发。 - 升级Firebase SDK到最新稳定版
执行以下命令更新SDK版本,修复旧版本bug:npm install firebase@latest - 排查网络拦截问题
打开浏览器开发者工具的「网络」面板,执行写操作时查看发往firestore.googleapis.com的请求状态,确认是否被拦截。也可以用无痕模式、禁用所有扩展后重试。 - 强制写操作走服务端验证
调用set方法时传入参数指定直接请求服务端,不走本地缓存:
此时如果有网络或者权限问题会直接抛出错误,方便排查。.set(data, { source: 'server' })
内容的提问来源于stack exchange,提问作者Muhammad Amir
相关产品推荐
相关产品推荐

