IndexedDB:未捕获(承诺)DOMException
Posted
技术标签:
【中文标题】IndexedDB:未捕获(承诺)DOMException【英文标题】:IndexedDB: Uncaught (in promise) DOMException 【发布时间】:2019-11-03 22:42:19 【问题描述】:我正在使用 indexedDB(通过 npm 的 idb 包装器)来存储代表音频通道数据的 2D Float32 数组。它可以正常工作一段时间,但是,当其中一个数组的长度达到大约16658432
时,idb 崩溃,但标题中出现异常。堆栈跟踪非常无用,因为我将 React 与 Next.js 结合使用,但是根据我的说法,它似乎在 idb 的缓存部分崩溃。注意:我可以存储多个大数组没问题,但是一旦它们中的任何一个超过这个“限制”,一切都会中断
这是我必须处理的限制,还是可以通过某种方式解决?我可以将二维数组拆分为两个数组并将它们存储为单独的条目,但这是一个不太理想的解决方案,一旦它们增长也会导致同样的问题。
只是一个简单的 idb 交易的包装器:
export const asyncPut = async (
dbName: string,
tableName: string,
key: string,
value: any // [Float32Array, Float32Array]
): Promise<void> =>
try
const db = await asyncOpenDb(dbName, tableName);
const transaction = db.transaction(tableName, "readwrite");
await transaction.objectStore(tableName).put(value, key);
catch (error)
// I catch the error here
console.error("**IDB Error:", error);
;
【问题讨论】:
在没有包装器库的情况下您会遇到错误吗? @Josh 我有,它也因同样的异常而崩溃。事件对象包含目标对象,其错误属性为DOMException
【参考方案1】:
我刚刚在 Chrome 中对此进行了测试,他们可能已经改进了您测试后的错误。
我尝试插入此数组时遇到的错误:
ar = new Array(16658432).fill(1)
是否超过了单个物体的最大尺寸:
target: IDBRequest
error: DOMException
code: 0
message: "The serialized keys and/or value are too large (size=515354750 bytes, max=133169152 bytes)."
name: "UnknownError"
__proto__: DOMException
测试于:
谷歌浏览器 版本 76.0.3809.100(官方构建)(64 位)【讨论】:
以上是关于IndexedDB:未捕获(承诺)DOMException的主要内容,如果未能解决你的问题,请参考以下文章
错误:`未捕获(承诺中)类型错误:无法读取未定义的属性'doc'`
循环内的承诺:TypeScript + Angular + IndexedDB