部分域名下IDBDatabase transaction报对象存储不存在问题咨询
这个报错的核心逻辑是:调用IDBDatabase.transaction()时传入的object store名称,在当前已建立连接的数据库实例中不存在。仅单域名触发的场景基本都是同域存储状态与代码预期不匹配导致,按优先级排查即可:
首先清理同域残留的脏IndexedDB数据
90%的单域名独发问题都是这个原因:当前域名之前部署过旧版本游戏、其他测试项目,和当前游戏使用了完全相同的IndexedDB数据库名,但object store结构不一致。浏览器会持久化同域下的IndexedDB数据,只要你代码里声明的数据库版本号和浏览器里存的旧库版本号一致,onupgradeneeded事件根本不会触发,连接拿到的是旧结构的数据库,自然找不到目标store。其他域名无问题本质是那些域名下没有残留同名旧库。
操作步骤:打开出问题的域名,F12打开开发者工具切到Application面板,找到Storage分类,勾选IndexedDB后点击清除站点数据,硬刷新页面重试。
代码层面的永久规避方案:不要只依赖onupgradeneeded建表,数据库连接成功后先校验是否存在目标object store,如果缺失就主动调用db.close(),用更高的版本号重新发起open请求,强制触发升级流程重建表结构。检查Construct 3的存储配置冲突
Construct 3默认的存档存储使用固定的数据库名,如果你在同域名下部署过多个C3游戏,且没有开启自定义存储前缀,多个游戏会共用同一个IndexedDB库,结构互相覆盖直接触发这个错误。检查项目属性里的存储设置,给当前游戏配置独立的存储前缀即可避免撞库。另外不要在引擎初始化完成前调用自定义IndexedDB逻辑,C3引擎启动时会自行初始化内置存储表,提前调用事务会赶在表创建完成前执行,直接抛错。排查浏览器存储权限拦截
如果清完数据还是报错,检查当前域名的存储权限:如果域名被浏览器标记为跟踪源、或者你手动设置了站点数据阻止权限,Safari、Firefox的严格隐私模式会返回临时的空IndexedDB实例,onupgradeneeded里的建表逻辑会静默失败,所有store都不会被创建。在地址栏左侧的站点权限设置里,把当前域名的站点数据权限设为允许即可。
避坑提示:所有IndexedDB事务操作必须放在数据库open请求的success回调、且
onupgradeneeded流程执行完成后再触发,不要在连接建立前提前调用事务,否则即使表结构正确也会偶发找不到store的错误。
内容的提问来源于stack exchange,提问作者geder768

