QuotaExceededError 表示 IndexedDB 写入超出浏览器配额,需双重校验 err.name 和 err.code,在 request.onerror 与 transaction.onabort 中处理,配合清理、压缩、降级及预估配额等策略主动应对。

当 IndexedDB 抛出 QuotaExceededError 时,说明当前数据库写入操作超出了浏览器为该源(origin)分配的存储配额。这不是可忽略的运行时错误,而是明确的存储空间不足信号,需主动降级或清理。
识别 QuotaExceededError 的准确方式
不能仅靠错误消息字符串判断(如 err.name === 'QuotaExceededError' 或 err.message.includes('quota')),因为不同浏览器实现有差异。应优先使用标准错误名 + 错误代码双重校验:
- 检查
err.name === 'QuotaExceededError'(Chrome、Edge、Firefox 均支持) - 补充检查
err.code === DOMException.QUOTA_EXCEEDED_ERR(更底层兼容) - 避免依赖
err.message,因 Safari 可能返回空字符串或本地化文本
在事务中捕获并安全回退
QuotaExceededError 通常发生在 put()、add() 或 clear() 等写操作中,且会自动中止当前事务。必须在 transaction.onabort 和 request.onerror 两级监听中响应:
- 在
request.onerror中立即判断是否为配额错误,若命中,调用event.preventDefault()防止默认错误冒泡干扰上层逻辑 - 在
transaction.onabort中统一处理事务级失败,例如记录日志、触发清理流程或通知用户 - 注意:事务一旦 abort,所有未提交变更丢失,不可重试原操作,需重新设计写入策略(如分块、压缩、降级存储)
主动清理与降级策略示例
捕获到配额错误后,不应直接报错退出,而应尝试释放空间或切换方案:
立即学习“Java免费学习笔记(深入)”;
- 删除过期/低优先级数据:按时间戳或访问频率索引,批量清除旧记录(如日志、缓存图片缩略图)
-
压缩写入内容:对大型 JSON 或二进制数据,在存入前用
CompressionStream(现代浏览器)或轻量级序列化(如 MessagePack)减小体积 - 降级到 localStorage(仅限小量结构化数据):若仅需存少量配置项,可 fallback 并提示“高级功能暂不可用”
-
请求用户授权扩容(Chrome 94+):调用
navigator.storage.persist()请求持久化存储(需用户手势触发),再重试关键写入
预防性检测配额使用情况
可在关键写入前粗略评估剩余空间,降低突发配额错误概率:
- 使用
navigator.storage.estimate()获取当前使用量与配额估算(返回{usage, quota}) - 若
usage / quota > 0.85,提前触发清理逻辑或禁用非核心写入入口 - 注意:该 API 返回的是估算值(尤其在 Firefox 中较粗略),不能替代异常捕获,仅作辅助预警


















