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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 04:30:05