[JavaScript][indexedDB] NotFoundError:无法在“IDBDatabase”上执行“事务”:找不到指定的对象存储之一

问题描述 投票:0回答:3

我正在开发一个网站,该网站将从表单中获取用户数据并将其显示在下表中。我正在使用 indexedDB,一切都可以在我的笔记本电脑上本地运行,但是当我将其部署到 GitHub 页面时,出现以下错误: NotFoundError:无法在“IDBDatabase”上执行“事务”:找不到指定的对象存储之一。

let db;
let request = window.indexedDB.open("newDatabase", 1);
request.onupgradeneeded = function (event) {var db = event.target.result;
var objectStore = db.createObjectStore("client", {autoIncrement: true,});
objectStore.createIndex("name", "name", { unique: false });
objectStore.createIndex("lastName", "lastName", { unique: false });
objectStore.createIndex("email", "email", { unique: true });
objectStore.createIndex("ID", "ID", { unique: true });
objectStore.createIndex("postal", "postal", { unique: false });
objectStore.createIndex("phoneNumber", "phoneNumber", { unique: true });
var formElements = document.getElementById("form");

  var request = db
  .transaction(["client"], 'readwrite')
  .objectStore("client")
  .add({
    name: formElements[0].value,
    lastName: formElements[1].value,
    email: formElements[2].value,
    postal: formElements[3].value,
    ID: formElements[4].value,
    phoneNumber: formElements[5].value,
  });

我在网上看到,当objectStore的名称与事务中的名称不同时,可能会发生这种情况,但这里不是这种情况,它们都是相同的。我尝试将它们更改为其他名称,但问题仍然存在......

db.createObjectStore("client", {autoIncrement: true,});
.
.
.
var request = db
  .transaction(["client"], 'readwrite')
javascript indexeddb
3个回答
8
投票

问题出在

request.onupgradeneeded
回调中,在我的实现中,我添加到
objectStore
两个具有 相同 ID 的客户端。正如您在下面的代码中所看到的,ID 应该是唯一的。通过添加这两个客户端,该函数会抛出错误并调用
request.onerror
,这就是无法打开数据库且未创建 objectStore 的原因。

request.onupgradeneeded = function (event) {
var db = event.target.result;
console.log("Object Store creation");
var objectstore = db.createObjectStore("client", {
    autoIncrement: true,
});

objectstore.createIndex("name", "name", { unique: false });
objectstore.createIndex("lastName", "lastName", { unique: false });
objectstore.createIndex("email", "email", { unique: true});
objectstore.createIndex("ID", "ID", { unique: true }); //HERE WAS THE PROBLEM
objectstore.createIndex("postal", "postal", { unique: false });
objectstore.createIndex("phoneNumber", "phoneNumber", { unique: true});

for (var i in clientData) {
    objectstore.add(clientData[i]); // Here was the error thrown
}
};

const clientData = [
    {
      name: "Piotr",
      lastName: "Wesoly",
      email: "[email protected]",
      ID: 'CCU238293', //The same ID as in the other client
      postal: "90-234",
      phoneNumber: "500500200"
    },
    {
      name: "Pawel",
      lastName: "Rosiak",
      email: "[email protected]",
      ID: 'CCU238293', //The same ID as in the other client
      postal: "93-234",
      phoneNumber: "500400200"
    },
  ];

解决方法很简单:将 unique 设置为 false将其中一个客户端的 ID更改为唯一的 ID。


1
投票
如果

onupgradeneeded

 中提供的数据库版本比当前版本新,则仅调用 get。由于一些测试,您可能已经拥有一个现有数据库,其中不包含 
open
 对象存储。我建议使用开发工具来调试已经存在的任何数据库。
这是 SO 的示例视图:

enter image description here

创建新模型后,我在 AWS Amplify 上遇到了此错误(该模型有一个自定义主键,我不确定这是否是原因)。但是,我可以通过

0
投票
来解决这个问题。请不要删除您的实际数据库。

enter image description here

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