Firebase Web端登出触发TypeError:无法删除数组对象的属性'0'
Firebase 调用
signOut触发Uncaught TypeError: Cannot delete property '0' of [object Array]解决方案 报错根因
该报错是Firebase Web v8兼容包的已知兼容问题,和业务代码逻辑无关:
SDK执行登出流程时,需要清理本地IndexedDB中存储的认证状态数组,原生逻辑会通过delete操作移除数组元素;Chrome 110及以上版本收紧了对非可配置数组属性的操作权限,当SDK尝试对被标记为不可配置的持久化状态数组执行delete操作时,会被运行环境直接拦截抛出该TypeError。
你提供的接入代码完全符合官方规范,不存在自定义逻辑导致的报错问题。
可落地修复方案
- 根源解决:升级Firebase SDK版本
将项目依赖中的firebase包升级至8.10.1及以上版本,该版本官方已经重构了本地状态清理逻辑,将原有的数组元素delete操作替换为符合ECMAScript规范的数组清空方法,从底层解决兼容问题。升级过程不需要修改原有业务代码,仅需调整package.json中的依赖版本后重新安装依赖即可。 - 临时调试方案:调整认证状态持久化策略
如果暂时无法完成SDK版本升级,可以在auth实例初始化后,显式将持久化模式切换为内存存储,绕开IndexedDB的本地数组清理逻辑,避免触发delete操作:
注意:该方案会导致页面刷新后用户登录状态丢失,仅适合临时调试场景,不建议在生产环境长期使用。// 原有初始化逻辑基础上补充配置 firebase.initializeApp(config); export const auth = firebase.auth(); // 显式指定认证状态仅存在于当前页面内存中 auth.setPersistence(firebase.auth.Auth.Persistence.MEMORY); - 兜底兼容方案:补充Promise异常捕获
现有业务代码对signOut的Promise仅配置了成功回调,没有对SDK内部抛出的兼容异常做拦截,导致报错直接抛出到控制台。可以在Promise链中补充错误捕获逻辑,过滤已知的数组删除报错,保证登出流程正常完成:onLogout = () => { auth.signOut() .then(() => { alert("Success"); }) .catch((err) => { // 过滤SDK已知的持久化清理兼容报错 if (err?.message?.includes("Cannot delete property")) { console.warn("触发SDK已知兼容报错,登出流程已正常完成"); alert("Success"); return; } // 其余真实业务异常正常抛出处理 throw err; }); };
内容的提问来源于stack exchange,提问作者Dumitru Corneliu
相关产品推荐
相关产品推荐

