[JavaScript][indexedDB] NotFoundError: не удалось выполнить «транзакцию» в «IDBDatabase»: одно из указанных хранилищ объектов не найдено

Я работаю над веб-сайтом, который будет брать пользовательские данные из формы и отображать их в таблице ниже. Я использую 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')
[JS за 1 час] - 9. Асинхронный
[JS за 1 час] - 9. Асинхронный
JavaScript является однопоточным, то есть он может обрабатывать только одну задачу за раз. Для обработки длительных задач, таких как сетевые запросы,...
Подъем в javascript
Подъем в javascript
Hoisting - это поведение в JavaScript, при котором переменные и объявления функций автоматически "перемещаются" в верхнюю часть соответствующих...
Как использовать API парсинга квитанций с помощью JavaScript за 5 минут?
Как использовать API парсинга квитанций с помощью JavaScript за 5 минут?
В этом руководстве вы узнаете, как использовать API парсинга квитанций за 5 минут с помощью JavaScript. Eden AI предоставляет простой и удобный для...
Хук useOnClickOutside в ReactJS
Хук useOnClickOutside в ReactJS
Как разработчик ReactJS, вы, возможно, сталкивались с ситуацией, когда вам нужно закрыть модальное или выпадающее меню, когда кто-то щелкает за его...
Хуки (часть-2) - useEffect
Хуки (часть-2) - useEffect
Хук useEffect - один из самых мощных и универсальных инструментов в арсенале разработчика React. Он позволяет вам управлять побочными эффектами в...
Простое руководство по тестированию взаимодействия с пользователем с помощью библиотеки тестирования React
Простое руководство по тестированию взаимодействия с пользователем с помощью библиотеки тестирования React
В предыдущем посте я показал вам на примерах, как писать базовые тесты в React. Важнейшей частью пользовательского интерфейса приложений является...
2
0
55
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Onupgradeneeded get вызывается только в том случае, если версия базы данных, указанная в open, новее текущей. Возможно, из-за некоторого тестирования у вас уже есть существующая база данных, которая не содержит хранилище объектов client. Я рекомендую использовать инструменты разработки для отладки уже существующих баз данных.

Вот пример представления для SO:

Вы правы, у меня уже есть база данных, в которой нет клиентов, но это странно. Потому что все базы данных, которые я создал, должны иметь хранилище объектов client. Если я снова запущу: let request = window.indexedDB.open("newDatabase", 1);, но с другим именем, создаст ли это новую базу данных, но на этот раз с клиентами? Вот моя проблема, по какой-то причине мой код иногда создает client хранилище объектов, а иногда нет... видимо, он не делает этого на страницах github

PiotrWesoly 20.11.2022 13:18

Я понял в чем проблема, но не знаю, почему это происходит: при первом открытии страницы создается база данных, но ее нельзя открыть, поэтому в нее не добавляются элементы базы данных . В следующий раз, когда я захожу на страницу, база данных уже есть (поэтому новая не создается). Поскольку база данных уже существует, код пытается извлечь данные из элементов, но не может, так как элементы в этой базе данных не существуют. Это происходит каждый раз и в разных браузерах...

PiotrWesoly 20.11.2022 14:01

Похоже на порядок действий. Пусть вам помогут примеры, приведенные на Morzilla dev: кликните по мне

WolverinDEV 20.11.2022 14:07
Ответ принят как подходящий

Проблема была в обратном вызове 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, либо изменить идентификатор одного из клиентов на что-то уникальное.

Другие вопросы по теме