因此,我正在使用API开发PWA。我只是设法设置代码以从API中获取国家/地区并将其存储在我的indexedDB中。但是,我不断收到“ idb.js:23未捕获(承诺)的DOMException:无法在'IDBObjectStore'上执行'put':对象存储使用嵌入式键,并且提供了key参数”。我已经尝试阅读有关它的内容,但对于此异常的含义尚不清楚。这是我正在处理的代码:
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");
})
});
答案 0 :(得分:2)
首先,这应该在做什么?
for (let res in data[currency]) {
countryStore.put(
data[currency],
data[currency][res]["currencyId"]
);
}
因为当前正在做的是“使用N个不同的主键将数据[货币]存储在我的数据库中N次”。几乎可以肯定这不是您想要做的。如果您希望能够基于存储在数组中的多个不同键在数据库中查找条目,请使用multiEntry索引。
错误是因为在对象存储库期望主键作为数据对象本身的属性存在时,您正在明确指定主键(put
的第二个参数)。这就是向keyPath
提供createObjectStore
参数的作用。如果您的keyPath是“ whatever”,那么它将在data[currency].whatever
中查找主键。
因此您可以通过将代码更改为此来摆脱错误消息:
for (let res in data[currency]) {
countryStore.put(
data[currency]
);
}
但这几乎肯定不是您想要执行的操作,因为它只会使用相同的主键将相同的数据简单地写入数据库N次,从而导致数据库中只有一个对象,并且浪费了大量时间反复写。如果数据库中有一个对象是您想要的结果,则可以执行以下操作:
countryStore.put(data[currency]);
然后,如果您需要以其他方式查询它,请使用索引。