You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

报错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
  • 部分移动端小众浏览器或特殊运行环境也可能缺失此方法
  • 你的报错直接说明当前运行环境没有实现这个函数,调用自然会触发类型错误

代码本身的额外问题

除了兼容性,你的代码还有两处逻辑错误:

  1. .then()回调写法错误:dbs => function(dbs) {...}返回的是一个未执行的函数,导致后续判断逻辑根本不会运行
  2. 错误的异常抛出逻辑:数据库不存在是正常场景,不是失败,不该直接抛出错误,应调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 03:10:05