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

Chrome随机删除indexedDB数据,是代码问题还是浏览器本身原因?

代码层面的潜在问题
  • onUpgrade方法未做存储存在性校验:当前实现直接调用createObjectStore,如果触发upgrade流程时对应存储已存在,会直接抛出异常,若上层异常处理逻辑包含删库重试的操作,会直接导致数据清空。
  • 缺少数据库连接异常事件监听:当前代码仅处理了open流程的成功/失败回调,未监听数据库实例的onversionchange、onclose、onerror事件。当其他标签页打开更高版本的同数据库时,会触发onversionchange事件,未主动关闭旧连接的话Chrome会强制终止连接,可能引发写入失败、数据库文件损坏。
  • 无版本回退异常兜底逻辑:如果用户本地的数据库版本高于代码中硬编码的版本号,open请求会直接触发error,若错误处理逻辑不合理,可能触发删库重建的操作。
Chrome 相关的可能触发原因
  • 自动存储驱逐:Chrome默认会为站点分配临时存储配额,当站点存储占用超过配额、或用户本地磁盘空间不足时,Chrome会自动清理不活跃站点的所有存储数据(包含IndexedDB、LocalStorage、缓存文件等),不会提前通知站点。
  • Profile隔离:不同Chrome Profile的存储数据完全独立,切换Profile后访问站点无法读取旧Profile下的IndexedDB数据,视觉上表现为数据被清空。
  • 损坏数据库自动清理:Chrome打开IndexedDB时如果检测到文件损坏(比如浏览器异常退出、磁盘写入错误、进程意外终止),会自动删除整个损坏的数据库文件,下次open时会触发upgrade流程重建空库,导致历史数据丢失。
修复方案
  1. 优化onUpgrade逻辑,增加存在性判断
onUpgrade(e) {
  Log(TAG, "open.onupgradeneeded");
  const db = e.currentTarget.result;
  // 先判断存储是否存在,避免重复创建抛出异常
  if (!db.objectStoreNames.contains(this.store)) {
    const store = db.createObjectStore(
      this.store, { keyPath: 'id', autoIncrement: true }
    );
    store.createIndex(CONNECTION_INDEX, ["name"], { unique: true });
  } else {
    // 后续版本迭代时可在此处添加数据迁移逻辑
  }
}
  1. 新增数据库异常事件监听,在open的成功回调中添加以下逻辑
req.onsuccess = (e) => {
  Log(TAG, "open.onsuccess");
  this.db = req.result;
  // 处理版本变更事件,主动关闭旧连接避免数据损坏
  this.db.onversionchange = () => {
    this.db.close();
    // 可在此处提示用户刷新页面使用最新版本
  };
  this.db.onclose = () => {
    Log(TAG, "数据库连接意外关闭");
    // 可在此处标记连接失效,避免后续写入操作报错
  };
  resolve(0)
};
  1. 申请持久化存储权限,避免被Chrome自动驱逐
    在页面初始化阶段执行以下代码,申请持久化存储权限,用户授权后Chrome不会自动清理该站点的存储数据:
if (navigator.storage?.persist) {
  navigator.storage.persist().then(isPersisted => {
    console.log("持久化存储授权状态:", isPersisted);
  });
}
  1. 排查所有错误处理逻辑,确认不存在open失败后直接调用indexedDB.deleteDatabase的不合理操作。

内容的提问来源于stack exchange,提问作者kargirwar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 23:45:00