IndexedDB 错误:NotFoundError:无法在“IDBDatabase”上执行“事务”:未找到指定的对象存储之一

Posted

技术标签:

【中文标题】IndexedDB 错误:NotFoundError:无法在“IDBDatabase”上执行“事务”:未找到指定的对象存储之一【英文标题】:IndexedDB Error : NotFoundError : Failed to execute 'transaction' on 'IDBDatabase': One of the specified object stores was not found 【发布时间】:2021-01-16 22:32:54 【问题描述】:

我在我的 ReactJs PWA 中创建了一个 IndexedDB 设置。

抛出以下错误:

NotFoundError: Failed to execute 'transaction' on 'IDBDatabase': One of the specified object stores was not found.

在线userSearchDBtx = userSearchDB.transaction("userdata","readwrite")

我的函数如下所示:

function Users() 
  let userSearchDB,userSearchDBstore,userSearchDBtx;
  let userDbrequest = window.indexedDB.open("MyTestDatabase", 1);

useEffect(()=>
  if (!window.indexedDB) 
      console.log("Your browser doesn't support a stable version of IndexedDB. Such and such feature will not be available.");
  

  else console.log("IndexedDB supported")

  userDbrequest.onupgradeneeded = function(event)  
    userSearchDB = event.target.result;
    userSearchDBtx = event.target.transaction;
    userSearchDBstore = userSearchDB.createObjectStore("userdata",keyPath:"uid")
  ;

  userDbrequest.onerror = function(event) 
    console.log("ERROR: " + event.target.errorCode)
  ;

  userDbrequest.onsuccess = function(event) 
    console.log("IndexdDb Working")
    userSearchDB = event.target.result
    userSearchDBtx = userSearchDB.transaction("userdata","readwrite");
    userSearchDBstore = userSearchDBtx.objectStore("userdata");
  ;
  //Here also put is unknown
  userSearchDBstore.put(uid:3854238974,phone:3257777,name:"shan",email:"1@1.com")

,[])


【问题讨论】:

【参考方案1】:
let userDbrequest = window.indexedDB.open("MyTestDatabase", 1);

将此行放在useEffect()中

代码应该是

let userSearchDB,userSearchDBstore,userSearchDBtx,userDbrequest;

useEffect(()=>
   userDbrequest = window.indexedDB.open("MyTestDatabase", 2);
   ...Conrinue your code
,[])

另外,在这样做的同时增加版本

【讨论】:

【参考方案2】:

您在连接数据库之前调用userSearchDBstore.put(...),这意味着没有保证升级需要回调完成,这意味着没有创建保证存储。

您需要等待。将 put 调用移至 open db 请求成功回调中,使其仅在数据库升级后运行。

【讨论】:

【参考方案3】:

我发现原因是错误的 storeNames 位于:const request = db .transaction(storeNames , "readwrite")

【讨论】:

以上是关于IndexedDB 错误:NotFoundError:无法在“IDBDatabase”上执行“事务”:未找到指定的对象存储之一的主要内容,如果未能解决你的问题,请参考以下文章

填充许多 ObjectStore 时的 IndexedDB,错误:无法在“IDBDatabase”上执行“事务”:版本更改事务正在运行

为啥这个 IndexedDB put 命令失败?错误:DataError:DOM IDBDatabase 异常 0

为啥 IndexedDB 在 node.js 中不可用? [关闭]

HTML5中indexedDB存储离线数据示例

js IndexedDB:浏览器端数据库的demo实例

在 Quasar 中使用 Dexie 导出 IndexedDB 数据库