indexedDB.deleteDatabase() 抛出错误

indexedDB.deleteDatabase() throws error

本文关键字:出错 错误 deleteDatabase indexedDB      更新时间:2023-09-26

我正在尝试删除用于单元测试的数据库:

var DeleteDb = indexedDB.deleteDatabase(dbName);

这段代码在 Jasmine 中的第一个之前直接调用。使用chrome devTools,我可以看到DeleteDb.error具有以下值:

错误: [异常: DOMException: 无法从"IDBRequest"读取"错误"属性:请求尚未完成。

DeleteDb.onsuccess

或 DeleteDb.onerror 永远不会被触发。此外,我从未尝试读取代码中的"错误"属性。

有人知道这个错误意味着什么,它来自哪里或我如何解决它吗?

更新:这段代码有时对我来说仍然失败。它给了我与上面相同的错误。

<html>
    <head>
        <script>
        var deleteDb = window.indexedDB.deleteDatabase('fakeNonExistentDatabase');
        deleteDb.onsuccess = function() {
            console.log('complete');
        };
        </script>
    </head>
</html>

我仍然不确定为什么会发生这种情况。 有时打开一个新选项卡或关闭另一个选项卡会起作用。此外,在删除成功回调时,它永远不会给出错误

更新 2好吧,似乎代码实际上正在工作,但是onsuccess事件永远不会被触发,因为在chrome devtools中按F8时不再触发任何事件。我现在得到的错误是:

未捕获的无效状态错误:无法在"IDBDatabase"上执行"事务":数据库连接正在关闭。

我认为上述错误消息是本文中第一个错误消息的结果,但实际上情况正好相反。我可以在互联网上找到一些关于这个主题的页面,但没有真正提供答案。

有什么想法吗?

还要检查被阻止。可能存在另一个数据库连接,使您的删除请求既不成功也不失败。

可以通过在打开的连接上侦听 onversionchange 来避免此行为,并确保在触发该事件时关闭连接。

好吧,

事实证明我的所有代码都很好,但是第二次删除数据库需要 10 秒到几分钟的时间。

您可以自己测试一下:这篇文章中的代码显示了它

发生的事情是 Jasmine 默认在 5 秒后超时(我将其更改为更高的数字,但谁会认为我需要那么长时间(

浏览器:铬 39.0.2171.71 m

删除时确保

  • 创建数据库的结果不为空
  • 删除前关闭结果
  • 通过您创建的同一连接删除

var init=function(){
	var request = this.connection.open(name,version);
	request.onupgradeneeded=function(e){
		var version=e.target.result;
	};
	request.onsuccess=function(e){
	   db.result=e.target.result;
	};
	request.onerror=function(e){
	};
};
var remove=function(){
	if (typeof db.result !== 'undefined') {
		db.result.close();
		return this.connection.deleteDatabase(version);
	}
}

这已经晚了 5 年,但以防万一有更多像我这样的人......

在删除数据库之前关闭与数据库的连接...

相关文章: