Edge扩展游戏IndexedDB保存函数失效,报对象仓库未找到错误
解决IndexedDB对象仓库未找到的错误
错误提示Uncaught NotFoundError: Failed to execute 'transaction' on 'IDBDatabase': One of the specified object stores was not found.的核心原因是:你没有在数据库初始化阶段创建名为store的对象仓库。IndexedDB要求必须通过onupgradeneeded事件来创建对象仓库,这是初始化数据库结构的唯一入口。
修复后的完整代码
保存函数修改版
function saveGameData(databaseName, storeName, data) { const request = indexedDB.open(databaseName, 1); request.onerror = () => { console.error("Database error:", request.error); }; // 数据库首次创建或版本升级时触发,用于初始化对象仓库 request.onupgradeneeded = (event) => { const db = event.target.result; // 避免重复创建对象仓库导致报错 if (!db.objectStoreNames.contains(storeName)) { // 创建对象仓库,若需要指定主键(比如数据里的id字段),可以添加keyPath参数: // db.createObjectStore(storeName, { keyPath: "id" }); db.createObjectStore(storeName); } }; request.onsuccess = () => { const db = request.result; const transaction = db.transaction(storeName, "readwrite"); const objectStore = transaction.objectStore(storeName); // 使用固定key"gameData"存储,方便后续直接通过key读取 const saveRequest = objectStore.put(data, "gameData"); saveRequest.onerror = () => { console.error("Error saving data:", saveRequest.error); }; saveRequest.onsuccess = () => { console.log("Data saved successfully"); }; // 事务完成后关闭数据库连接,释放资源 transaction.oncomplete = () => { db.close(); }; }; }
修正定时保存逻辑
你的init函数中,data是在初始化时创建的,后续定时调用时不会更新money和monkey的最新值,需要把data的创建移到定时器内部:
function init() { setInterval(() => { // 每次保存时获取最新的游戏数据 const data = { money: money, monkey: monkey }; saveGameData("myDatabase", "store", data); }, 2000); }
关键要点说明
onupgradeneeded事件:只有当数据库首次被打开,或者打开时指定的版本号高于当前数据库版本时才会触发,必须在这里完成对象仓库的创建或修改。- 对象仓库主键:如果你的游戏数据需要唯一标识,创建仓库时可以指定
keyPath(比如{ keyPath: "id" }),或者在调用put时传入第二个参数作为固定key(如示例中的"gameData"),这样后续读取数据时可以直接通过这个key获取。 - 数据库连接:每次操作完成后记得关闭数据库连接,避免占用浏览器资源。
内容的提问来源于stack exchange,提问作者Levi Daniels
相关产品推荐
相关产品推荐

