Я работаю над веб-сайтом, который будет брать пользовательские данные из формы и отображать их в таблице ниже. Я использую 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')
Onupgradeneeded get вызывается только в том случае, если версия базы данных, указанная в open, новее текущей. Возможно, из-за некоторого тестирования у вас уже есть существующая база данных, которая не содержит хранилище объектов client. Я рекомендую использовать инструменты разработки для отладки уже существующих баз данных.
Вот пример представления для SO:
Я понял в чем проблема, но не знаю, почему это происходит: при первом открытии страницы создается база данных, но ее нельзя открыть, поэтому в нее не добавляются элементы базы данных . В следующий раз, когда я захожу на страницу, база данных уже есть (поэтому новая не создается). Поскольку база данных уже существует, код пытается извлечь данные из элементов, но не может, так как элементы в этой базе данных не существуют. Это происходит каждый раз и в разных браузерах...
Похоже на порядок действий. Пусть вам помогут примеры, приведенные на Morzilla dev: кликните по мне
Проблема была в обратном вызове request.onupgradeneeded, в моей реализации я добавлял в objectStore двух клиентов с одинаковым ID. Как вы можете видеть в приведенном ниже коде, идентификатор должен быть уникальным. При добавлении этих двух клиентов функция выдавала ошибку и вызывала request.onerror, поэтому база данных не могла быть открыта, а objectStore не создавался.
request.onupgradeneeded = function (event) {
var db = event.target.result;
console.info("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: "PiotrWesoly@gmail.com",
ID: 'CCU238293', //The same ID as in the other client
postal: "90-234",
phoneNumber: "500500200"
},
{
name: "Pawel",
lastName: "Rosiak",
email: "pawelRosiak@gmail.com",
ID: 'CCU238293', //The same ID as in the other client
postal: "93-234",
phoneNumber: "500400200"
},
];
Исправить это было легко: либо установить для уникальности значение false, либо изменить идентификатор одного из клиентов на что-то уникальное.
Вы правы, у меня уже есть база данных, в которой нет клиентов, но это странно. Потому что все базы данных, которые я создал, должны иметь хранилище объектов client. Если я снова запущу: let request = window.indexedDB.open("newDatabase", 1);, но с другим именем, создаст ли это новую базу данных, но на этот раз с клиентами? Вот моя проблема, по какой-то причине мой код иногда создает client хранилище объектов, а иногда нет... видимо, он не делает этого на страницах github