网站搜索

javascript - 无法读取未定义的 IndexedDB 的 'transaction' 属性


我正在使用IndexDB创建一个用户的对象存储,但在尝试添加用户时,我在var request=db.transaction(['person'], 'readwrite')这一行遇到了错误。

给出的错误是:

"未捕获的类型错误:无法读取未定义的属性 'transaction',发生在 add (test.js:32),位于 test.js:45"

我的脚本看起来是这样的:

var request = window.indexedDB.open("connectDB", 1);

request.onerror = function (event) 
{
console.log('The database is opened failed');
};

var db;

request.onsuccess = function (event) 
{
    db = request.result;
console.log('The database is opened successfully');
};

var db;

request.onupgradeneeded = function (event) 
{
    db = event.target.result;
    var objectStore;
    if (!db.objectStoreNames.contains('users'))
    {
        objectStore = db.createObjectStore('users', { keyPath: 'id' });
        objectStore.createIndex('name', 'name', { unique: false });
        objectStore.createIndex('email', 'email', { unique: true });
    }
}

function add() 
{
  var request = db.transaction(['person'], 'readwrite')
    .objectStore('person')
    .add({ id: 1, name: 'Jam', age: 24, email: '[email ' });

  request.onsuccess = function (event) {
    console.log('The data has been written successfully');
  };

  request.onerror = function (event) {
    console.log('The data has been written failed');
  }
}

add();

任何帮助都将不胜感激

答案#1

看起来你在调用 add() 时试图访问 db,而此时它尚未初始化(请注意,这次对 add() 的调用是在你的脚本执行时立即发生的)。

db 变量只有在数据库连接成功创建时才会被初始化:

request.onsuccess = function (event) 
{
    db = request.result;
    console.log('The database is opened successfully');

    // It is now safe to interact with the database
};

有多种方法可以解决这个问题,不过最简单的方法是将你的调用 add() 移动到 onsuccess 处理程序中,如下所示:

request.onsuccess = function (event) 
{
    db = request.result;
    console.log('The database is opened successfully');

    add(); // Add this
};

// add(); <-- remove this from the end of your script

最后,我注意到你声明了两个 var db; 变量——考虑删除其中一个。希望这能帮到你!