无法读取未定义IndexedDB的属性“事务”

时间:2018-12-25 00:29:20

标签: javascript indexeddb

我正在使用IndexDB创建用户的对象存储,但是在尝试添加用户时,在var request = db.transaction(['person'], 'readwrite')行上出现错误。

给出的错误是:

  

“未捕获的TypeError:无法读取的属性'事务'    未定义       在添加(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: 'jam@example.com' });

  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 个答案:

答案 0 :(得分:1)

似乎未初始化db时您正在尝试访问add()(请注意,在执行脚本时立即发生对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;变量-请考虑删除其中一个。希望这会有所帮助!