什么可能导致indexeddb事务在我的代码中不起作用

问题描述 投票:0回答:2
var database = window.indexedDB.open("myTestDatabase", 3);

database.onerror = function(event) {
    alert('Error creating database');
}

database.onupgradeneeded = function(event) {
    var db = event.target.result;

    console.log(1);
    //
    if (!db.objectStoreNames.contains("data")) {
        //Add to indexDB
        db.createObjectStore("data", {
            keypath: "data"
        });
    }
}

//If the database is creaed run.
database.onsuccess = function(event) {
    var db = event.target.result;

    var transaction = db.transaction(["data"], 'readwrite');
    //More code here to store data into indexeddb
}

运行代码时,遇到以下错误:Uncaught NotFoundError: 无法在“IDBDatabase”上执行“transaction”:未找到指定的对象存储之一。

查看indexeddb时,会创建“myTestDatabase”,但不会创建“data”对象存储。这可能有什么问题?有时它会起作用,但有时会失败。

javascript indexeddb
2个回答
1
投票

将版本从 1 增加到 2,对我有用 const openRequest = window.indexedDB.open('purple_score', 2);


0
投票

您只能在数据库升级期间向 Indexeddb 数据库添加新的对象存储:即。

onupgradeneeded

看修改如下;

const createObjectStore = (
  database,
  objectStore,
  key,
  indexIsUnique = true
) => {
  const DB = indexedDB
  let request = DB.open(database)

  request.onsuccess = () => {
    let db = request.result
    if(!db.objectStoreNames?.contains(objectStore)) 
    {
      let newDBVersion = db.version + 1
      db.close()

      let newRequest = DB.open(database, newDBVersion)

      newRequest.onupgradeneeded = () => {
        let upgradedDB = newRequest.result
        try 
        {
          const collection = upgradedDB.createObjectStore(objectStore, { keyPath: key })
          collection.createIndex(key, key, { unique: indexIsUnique })
        } catch (error) 
        { throw new Error(error) }
      }
                    
      newRequest.onerror = (error) => {
        throw new Error(error)
      }
    }
  }

  request.onerror = (e) => {
    alert(e)
    console.log(e);
  }
}

我还建议您将此函数重写为

async
函数或
Promise
但这完全取决于您。

© www.soinside.com 2019 - 2024. All rights reserved.