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

Ada*_*dam 6 javascript indexeddb

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

给出的错误是:

“未捕获的类型错误:无法在 test.js:45 处的 add (test.js:32) 处读取未定义的属性‘交易’”

我的脚本如下所示:

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();
Run Code Online (Sandbox Code Playgroud)

任何帮助,将不胜感激

Dac*_*nny 6

看起来您正在尝试在未初始化时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
};
Run Code Online (Sandbox Code Playgroud)

有多种方法可以解决此问题,但最简单的方法是将调用移至处理程序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
Run Code Online (Sandbox Code Playgroud)

最后,我注意到您声明了两个var db;变量 - 考虑删除其中之一。希望这可以帮助!