使用IndexedDB保存对象报错:执行transaction时未找到指定对象仓库
IndexedDB报错:找不到指定的对象仓库解决方案
你遇到的错误:
Failed to execute 'transaction' on 'IDBDatabase': One of the specified object stores was not found.
核心原因是你的数据库中没有创建名为toDoList的对象仓库。
IndexedDB的对象仓库必须在数据库版本升级(onupgradeneeded事件)时创建,当你调用indexedDB.open("toDoList", 4)时,如果数据库是首次创建,或者当前版本低于4,必须在onupgradeneeded回调中初始化对象仓库,否则数据库里不会存在对应的对象仓库,后续打开事务时就会报错。
修正后的完整代码
let db; // 全局变量存储数据库实例 function saveIntoIndexedDb() { const DBOpenRequest = indexedDB.open("toDoList", 4); // 数据库版本升级/首次创建时触发,用于初始化对象仓库 DBOpenRequest.onupgradeneeded = (event) => { db = event.target.result; // 检查对象仓库是否已存在,避免重复创建报错 if (!db.objectStoreNames.contains("toDoList")) { // 创建toDoList对象仓库,指定taskTitle为主键(可根据需求调整) db.createObjectStore("toDoList", { keyPath: "taskTitle" }); } console.log("数据库版本升级,对象仓库已创建"); }; DBOpenRequest.onsuccess = (event) => { console.log("Database initialized."); db = DBOpenRequest.result; addData(); }; // 处理数据库打开失败的情况 DBOpenRequest.onerror = (event) => { console.error("数据库打开失败:", event.target.error); }; } function addData() { const newItem = { taskTitle: "Walk dog", hours: 19, minutes: 30, day: 24, month: "December", year: 2013, notified: "no", }; try { const transaction = db.transaction(["toDoList"], "readwrite"); transaction.oncomplete = (event) => { console.log("Transaction completed."); }; transaction.onerror = (event) => { console.error("Transaction error:", event.target.error); }; const objectStore = transaction.objectStore("toDoList"); const objectStoreRequest = objectStore.add(newItem); objectStoreRequest.onsuccess = (event) => { console.log("Request successful."); }; objectStoreRequest.onerror = (event) => { console.error("添加数据失败:", event.target.error); }; } catch (err) { console.error("事务创建失败:", err); } }
关键说明
onupgradeneeded是唯一能创建对象仓库的时机:IndexedDB规定,只有在数据库版本升级或首次创建时,才能创建/修改对象仓库,其他时机调用createObjectStore会直接报错。- 避免重复创建对象仓库:用
db.objectStoreNames.contains("toDoList")检查仓库是否存在,防止多次触发onupgradeneeded时重复创建导致的错误。 - 主键设置:创建对象仓库时必须指定主键(
keyPath),或者开启自动递增(autoIncrement: true),示例中用taskTitle作为主键,你可以根据业务逻辑调整(比如用自动生成的ID)。 - 完善错误处理:补充了各阶段的错误回调,能更精准地定位问题(比如主键重复、权限不足等)。
内容的提问来源于stack exchange,提问作者Trystan Lapinig-Wilcock
相关产品推荐
相关产品推荐

