8

在 Firefox 17.0.1 中,当我尝试打开 IndexedDB 数据库时,Firebug 控制台向我显示InvalidStateError异常。也引发了事件,request.onerror未定义event.target.errorCode

if (window.indexedDB) {
    var request = window.indexedDB.open('demo', 1);
    request.onsuccess = function(event) {
        // not raised
    };
    request.onupgradeneeded = function(event) {
        // not raised
    };
    request.onerror = function(event) {
        // raised with InvalidStateError
    };
}

有人在 Firefox 中使用过 IndexedDB 吗?

更新

Firefox 18.0.1 具有相同的行为。完整的源代码

4

4 回答 4

3

我回答是因为问题仍然存在(在 Firefox 54 中)。如果您:

为了防止InvalidStateErrortry catch不起作用(但对其他错误很有用,例如禁用的 cookie),您需要event.preventDefault()。是的,我知道,太容易成为现实。:)

if (window.indexedDB) {
    var request = window.indexedDB.open('demo', 1);
    request.onsuccess = function(event) {
        // not raised
    };
    request.onupgradeneeded = function(event) {
        // not raised
    };
    request.onerror = function(event) {
        // raised with no InvalidStateError
        if (request.error && request.error.name === 'InvalidStateError') {
            event.preventDefault();
        }
    };
}

荣誉转到https://bugzilla.mozilla.org/show_bug.cgi?id=1331103#c3

于 2017-08-14T10:51:23.270 回答
1

我很确定您得到的错误是版本错误,这意味着数据库的当前版本高于您打开数据库的版本。如果您查看 event.target.error,您会看到名称将包含“VersionError”。

另一种可能性是您将看到“AbortError”,这意味着 VERSION_CHANGE 事务已中止。这意味着 onupgradeneeded 事件中有错误导致中止。如果您正在创建一个已经存在的对象存储,您可以得到这个。

如果不提供有关您收到的错误的更多信息,我也看不到其他可能性。

于 2013-02-11T15:49:43.720 回答
0

您需要在单独的事务中创建对象存储,您将打开数据库和创建对象存储事务集中到同一个事件中。

此外,您的对象存储不能同时拥有autoincrementpathas 选项。你必须选择一个或另一个。

这是将使您的示例运行的代码:

    function initDB() {
        if (window.indexedDB) {
            var request = window.indexedDB.open('demo', 1);
            request.onsuccess = function(event) {
                db = event.target.result;
                createObjectStore();
            };
            request.onupgradeneeded = function(event) {
                db = event.target.result;
                $('#messages').prepend('blah blah<br/>');
            };
            request.onerror = function(event) {
                $('#messages').prepend('Chyba databáze #' + event.target.errorCode + '<br/>');
            };
        }
    }

    function createObjectStore() {
        db.close();
        var request = window.indexedDB.open('demo', 2);
        request.onsuccess = function(event) {
            db = event.target.result;
            showDB();
        };
        request.onupgradeneeded = function(event) {
            db = event.target.result;
            $('#messages').prepend('yeah yeah yeah<br/>');
            var store = db.createObjectStore('StoreName', { keyPath: 'id' });
            store.createIndex('IndexName', 'id', { unique: true });
        };
        request.onerror = function(event) {
            $('#messages').prepend('Chyba databáze #' + event.target.errorCode + '<br/>');
        };
    }

如果您开始遇到困难,可以查看我为 Firefox 插件 SDK 编写的一些 indexeddb 代码。代码比您需要的更复杂,但您将能够看到所有需要发生的事件、错误和事务顺序。https://github.com/clarkbw/indexed-db-storage

祝你好运!

于 2013-02-13T20:13:50.323 回答
0

如果在 FireFox 设置的隐私选项卡中将浏览器设置为“不存储历史记录”,那么在使用 IndexedDB 时,FireFox 也会抛出“InvalidStateError”。

我相信当设置该设置时,FireFox 基本上以隐身模式运行。在私有模式下运行 FireFox 时,IndexedDB 不可用。

于 2019-01-08T12:56:18.397 回答