报错Uncaught (in promise) TypeError: window.indexedDB.databases is not a function求解
解决Uncaught (in promise) TypeError: window.indexedDB.databases is not a function错误
核心原因:IndexedDB.databases() API兼容性不足
indexedDB.databases()用于获取当前环境下的所有IndexedDB数据库列表,但这个方法的支持范围有限:
- 旧版Safari(14.1及以下)完全不支持该API
- 部分移动端小众浏览器或特殊运行环境也可能缺失此方法
- 你的报错直接说明当前运行环境没有实现这个函数,调用自然会触发类型错误
代码本身的额外问题
除了兼容性,你的代码还有两处逻辑错误:
.then()回调写法错误:dbs => function(dbs) {...}返回的是一个未执行的函数,导致后续判断逻辑根本不会运行- 错误的异常抛出逻辑:数据库不存在是正常场景,不是失败,不该直接抛出错误,应调用callback返回
false
修复方案
方案1:兼容性降级,改用打开数据库的方式判断存在性
这种方式兼容性更强,几乎支持所有支持IndexedDB的浏览器,通过尝试打开数据库,判断是否触发upgradeneeded事件来确定数据库是否存在:
function dbReady(dbName, callback) { if (typeof window === "undefined" || !window.indexedDB) { typeof callback === 'function' && callback(false); return; } const request = window.indexedDB.open(dbName); let dbExists = true; // 触发upgradeneeded说明数据库不存在,需要初始化创建 request.onupgradeneeded = () => { dbExists = false; // 关闭刚创建的空数据库,避免占用资源 request.result.close(); }; request.onsuccess = () => { typeof callback === 'function' && callback(dbExists); request.result.close(); }; request.onerror = () => { console.error('检查数据库状态失败:', request.error); typeof callback === 'function' && callback(false); }; }
方案2:保留databases()逻辑,增加兼容性检测
如果一定要使用databases()方法,需要先检测方法是否存在,同时修复原代码的逻辑错误:
function dbReady(dbName, callback) { if (typeof window === "undefined") { typeof callback === 'function' && callback(true); return; } // 先检测databases方法是否存在 if (!window.indexedDB || typeof window.indexedDB.databases !== 'function') { console.warn('当前环境不支持indexedDB.databases()方法'); typeof callback === 'function' && callback(false); return; } window.indexedDB.databases() .then(dbs => { const dbExists = dbs.map(db => db.name).includes(dbName); typeof callback === 'function' && callback(dbExists); return dbExists; }) .catch(e => { console.error('获取数据库列表失败:', e); typeof callback === 'function' && callback(false); }); }
关键提示
- 打开数据库的方式兼容性更好,是判断数据库存在性的推荐方案
- 如果在服务端渲染(SSR)环境使用,需确保代码仅在客户端执行
- 无论哪种方案,都要处理
indexedDB本身不存在的极端情况
内容的提问来源于stack exchange,提问作者NickO
相关产品推荐
相关产品推荐

