IndexedDB升级版本号后open方法未触发onsuccess的问题求助
为什么IndexedDB升级版本号后onsuccess事件没触发?
这问题我之前踩过坑!当你提升IndexedDB的版本号时,浏览器不会直接触发onsuccess——这是它的内置机制:版本升级意味着你可能需要修改数据库的结构(比如新增/删除对象仓库、调整索引),浏览器必须先触发onupgradeneeded事件,等你完成所有升级相关的操作后,才会继续执行后续的onsuccess流程。
你的代码里第二次打开版本2的数据库时,没有监听onupgradeneeded事件,浏览器就会卡在版本升级的步骤,自然不会走到onsuccess了。
解决方法:必须监听并处理onupgradeneeded事件
哪怕你这次升级不需要修改任何数据库结构,也要监听这个事件,让浏览器完成版本升级的流程。示例代码如下:
var request = indexedDB.open("content", 2); // 先处理版本升级事件——这是版本提升后的必经步骤 request.onupgradeneeded = function(e) { console.log("数据库版本正在升级..."); var db = e.target.result; // 这里可以添加版本升级的具体操作,比如: // 1. 创建新的对象仓库 // if (!db.objectStoreNames.contains('userData')) { // db.createObjectStore('userData', { keyPath: 'userId' }); // } // 2. 给现有仓库添加索引 // var store = e.target.transaction.objectStore('oldStore'); // store.createIndex('nameIndex', 'name', { unique: false }); // 如果不需要修改结构,空函数也可以,只要监听了这个事件就行 }; request.onsuccess = function(e) { console.log("onsuccess"); var db = e.target.result; // 这里可以进行正常的数据库读写操作 }; // 别忘了监听错误事件,排查问题更方便 request.onerror = function(e) { console.error("数据库操作出错:", e.target.error.message); };
额外说明
- 第一次创建数据库(版本1)时,其实也会触发
onupgradeneeded事件,只是因为是初始创建,浏览器执行完这个事件后直接走到onsuccess,所以你之前没察觉到异常。 - 如果升级过程中出现错误(比如权限不足、操作不符合IndexedDB规则),
onerror事件会被触发,一定要监听它来排查问题。
内容的提问来源于stack exchange,提问作者Blake
相关产品推荐
相关产品推荐

