- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以我正在开发一个使用 API 的 PWA。我刚刚设法设置代码以从 API 获取国家并将它们存储在我的 indexedDB 中。但是我不断收到“idb.js:23 Uncaught (in promise) DOMException: Failed to execute 'put' on 'IDBObjectStore': The object store uses in-line keys and the key parameter was provided.”我曾尝试阅读它,但对于此异常的含义还不够清楚。这是我正在处理的代码:
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");
})
});
最佳答案
首先,这应该做什么?
for (let res in data[currency]) {
countryStore.put(
data[currency],
data[currency][res]["currencyId"]
);
}
因为目前它正在做的是“使用 N 个不同的主键在我的数据库中存储数据 [货币] N 次”。这几乎肯定不是您想要做的。如果您希望能够根据存储在数组中的多个不同键在数据库中查找条目,请使用多条目索引。
错误是因为当您的对象存储期望主键作为数据对象本身的属性出现时,您显式指定了主键(put
的第二个参数)。这就是向 createObjectStore
提供 keyPath
参数的作用。如果您的 keyPath 是“whatever”,那么它将在 data[currency].whatever
中查找主键。
因此,您可以通过将代码更改为这样来摆脱错误消息:
for (let res in data[currency]) {
countryStore.put(
data[currency]
);
}
但这仍然几乎肯定不是您想要做的,因为它只会使用相同的主键将相同的数据写入数据库 N 次,导致数据库中只有一个对象并浪费大量时间反复写。如果数据库中的一个对象是您想要的结果,您可以这样做:
countryStore.put(data[currency]);
然后如果您需要以不同的方式查询它,请使用索引。
关于javascript - 在测试我的 PWA 时,我不断收到 IDBObjectStore 错误。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51174529/
IDBObjectStore有一个方法 getAll() . 但是,TypeScript 报告没有这样的方法。 lib.d.ts 中的相关部分是: interface IDBObjectStore {
我正在尝试将 javascript 对象(函数构造函数)添加到 IndexedDB 但出现错误 Failed to execute 'add' on 'IDBObjectStore': functio
我正在尝试掌握使用 indexedDB 在客户端存储数据的窍门。 考虑以下代码: function queryURL(message, sender) { chrome.contextMenu
我有一个类,其中某些属性不应存储到 indexedDB 存储中。当我克隆对象并随后删除属性时它可以工作,但是我不太喜欢这个解决方案。我想知道是否有一种解决方案,我们只是将属性设置为私有(private
我一直在阅读 MDN,但我得到了 stuff like : keyPath The key path for the index to use. Note that it is possible to
我支持的基于 chrome 的 APP 给了我们这个错误。我试图找出更多关于错误的信息,但没有成功。有人可以向我解释一下这可能是什么原因吗。 错误如下图 看跌期权发生在这段代码中 var ydbReq
当尝试在 chrome 中存储已编译的 wasm 模块时,这是我收到的错误:无法在“IDBObjectStore”上执行“put”:无法克隆对象。 但根据 MDN 的说法,这应该是可能的。 https
我正在尝试使用indexedDB更新我的简单应用程序中的条目,但是我收到无法在“IDBObjectStore”上执行“put”:事务已完成。 我似乎无法弄清楚为什么它无法完成事务,我尝试了调试器,它停
所以我正在开发一个使用 API 的 PWA。我刚刚设法设置代码以从 API 获取国家并将它们存储在我的 indexedDB 中。但是我不断收到“idb.js:23 Uncaught (in promi
在此代码中,当我查看控制台时,我在 store1.add 遇到问题,它显示 TransactionInactiveError: 无法在“IDBObjectStore”上执行“add”:事务未激活。 任
这似乎是 Safari 唯一的错误。据我所知,它不会出现在 Chrome 中。我有一个非常标准的 IndexedDB 设置。我调用 initDb,保存结果,这为我提供了一种调用数据库的好方法。 var
我正在尝试将一些值添加到对象存储中,得到这个错误作为返回(在第 22 行)。对象存储使用 keyPath 'id' 和 autoincrement: true。 function cacheObjec
我正在使用 Google map API 和 HTML 5 地理定位 API 将我的位置显示为 map 上的标记。显示此标记后,我有一个简单的标记双击功能,可以使用 indexedDB 将新标记保存到
在 IndexedDB 中,有两种方法可以更新数据库中已有的对象。您可以调用 IDBCursor.update 或 IDBObjectStore.put。 两者都接受更新后的对象作为参数。 IDBCu
我有一个 indexeddb,当我第一次在 chrome 中打开我的网站并尝试调用 init.savedb();我收到一条错误消息 未捕获的 DOMException:无法在“IDBObjectSto
我是一名优秀的程序员,十分优秀!