我正在遵循MDN guide,如果我使用指南中提供的数据(customerData),它可以在我的计算机上工作。我能够打开我自己的IndexedDB,创建对象存储并创建索引,它只是总是空的,所以我认为问题出在事务上。
的确,第一行代码来自向数据库添加数据部分(const transaction = db.transaction([“customers”],“readwrite”);)会给我带来问题,因为(我认为)db只是以前在onupgradeneeded事件中定义的,所以它会导致“未捕获的ReferenceError:db is not defined”(未定义数据库)。
我尝试将 adding data to database 部分中的所有代码 Package 在一个成功事件请求中,并添加“constdb = event.target.result;“before“const transaction db.transaction([“客户”],“读写”);“,但是在结尾的这段代码中已经有一个对成功事件的请求,我删除了它,留下“event.target.result === customer.ssn;“。虽然错误消失了(数据库仍然为空),但这并不正常。
不过,示例代码在需要升级时可以工作,而我的代码不行,即使是第一次或更改版本号时也不行,因此,我遇到的另一个问题似乎是要添加的数据。我有一个用键索引的对象数组。我正在使用一个函数将一个变量推入数组。该变量是用“document.getElementsByClassName”定义的当网页满足某些条件时,我认为问题是变量是一个HTML集合,但数组是在控制台日志中填充的。我还使用了不带Key Path的autoIncrement,根据指南,它可以保存任何类型的值。
我还尝试将整个indexedDB代码放在if函数中,因为我的控制台日志首先确认了“All done!",所以事务将数据添加到数据库中,但是数组可能是空的,因为填充它的条件还没有满足。但是,什么也没有。您可以在下面找到我的通用代码。对于冗长的解释表示歉意,但是我尝试了一些方法来修复它,但没有效果。
const array = [];
setInterval(function(){
var Button = document.getElementsByClassName(html class);
if(Button != undefined && Button.length > 0) {
var collection2 = document.getElementsByClassName(html class)).item(0);
array.push(collection2);
console.log(array);
}, 3000)
const dbName = "db name";
const request = indexedDB.open(dbName, 1);
request.onerror = (event) => {
console.error(`Database error: ${event.target.errorCode}`);
};
request.onupgradeneeded = (event) => {
const db = event.target.result;
//Create an objectStore to hold information
//can the key path and index be the same?
const objectStore = db.createObjectStore("Table", { autoIncrement : true });
// Create an index to search
objectStore.createIndex('innerHTML', 'innerHTML', { unique: true });
// Use transaction oncomplete to make sure the objectStore creation is
// finished before adding data into it.
objectStore.transaction.oncomplete = (event) => {
// Store values in the newly created objectStore.
const TableObjectStore = db.transaction("Table", "readwrite").objectStore("Table");
array.forEach((Table) => {
objectStore.add(Table.innerHTML);//Doesn't seem to work as it should
});
};
};
//Uncaught ReferenceError: db is not defined
const transaction = db.transaction(["Table"], "readwrite");
// Do something when all the data is added to the database.
transaction.oncomplete = (event) => {
console.log("All done!");
};
transaction.onerror = (event) => {
console.log("Error");
};
const objectStore = transaction.objectStore("Table");
array.forEach((Table) => {
const request = objectStore.add(Table);
request.onsuccess = (event) => {
event.target.result === Table.innerHTML;
};
});
1条答案
按热度按时间ycl3bljg1#
将数据库从嵌套函数移到顶层。