You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.24 21:36:02