Я продолжаю получать ошибку IDBObjectStore во время тестирования моего PWA. - PullRequest
0 голосов
/ 04 июля 2018

Итак, я разрабатываю PWA с использованием API. Мне просто удалось настроить код для извлечения стран из API и сохранения их в моей indexedDB. Однако я продолжаю получать «idb.js: 23 Uncaught (в обещании) DOMException: Не удалось выполнить« положить »на« IDBObjectStore »: хранилище объектов использует встроенные ключи, и был предоставлен параметр ключа». Я пытался прочитать об этом, но не совсем ясно, что подразумевается под этим исключением. вот код, над которым я работаю:

fetch(apiURL)
    .then(response => {
        return response.json();
    })
    .then(data => {
        dataBee.then(db => {
                if (!db) return;

                let txn = db.transaction('countryRecords', 'readwrite');
                let countryStore = txn.objectStore('countryRecords');

                //data is a multi-nested object from the API
                for (let currency in data) {
                    for (let res in data[currency]) {
                        countryStore.put(
                            data[currency],
                            data[currency][res]["currencyId"]
                        );
                    }
                }
                return txn.complete;
            })
            .then(() => {
                console.log("countries successfully added");
            })

    });

1 Ответ

0 голосов
/ 04 июля 2018

Прежде всего, что это должно делать?

                    for (let res in data[currency]) {
                        countryStore.put(
                            data[currency],
                            data[currency][res]["currencyId"]
                        );
                    }

Потому что в настоящее время он «хранит данные [валюту] в моей базе данных N раз с N различными первичными ключами». Это почти наверняка не то, что вы хотите сделать. Если вы хотите иметь возможность искать запись в базе данных на основе нескольких разных ключей, которые хранятся в массиве, используйте индекс multiEntry.

Ошибка заключается в том, что вы явно указываете первичный ключ (второй параметр put), когда хранилище объектов ожидает, что первичный ключ будет присутствовать в качестве свойства самого объекта данных. Вот что делает параметр keyPath для createObjectStore. Если ваш keyPath равен «что угодно», то в data[currency].whatever он найдет первичный ключ.

Таким образом, вы можете избавиться от сообщения об ошибке, изменив свой код так:

                    for (let res in data[currency]) {
                        countryStore.put(
                            data[currency]
                        );
                    }

Но это почти наверняка не то, что вы хотите сделать, потому что он будет просто записывать одни и те же данные в базу данных N раз с одним и тем же первичным ключом, в результате чего в базе данных будет только один объект и куча потерянного времени. пишу это неоднократно. Если вы хотите получить один объект в базе данных, вы можете просто сделать это:

                    countryStore.put(data[currency]);

И затем, если вам нужно запросить его по-разному, используйте индексы.

...