在Firefox中打开IndexedDB时出现InvalidStateError

时间:2012-12-20 12:36:51

标签: javascript firefox indexeddb

在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
    };
}

有没有人在Fi​​refox中使用过IndexedDB?

更新

Firefox 18.0.1具有相同的行为。 Comlete source

4 个答案:

答案 0 :(得分:3)

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

,就会发生这种情况

要防止 InvalidStateError 尝试捕获不起作用(但对其他错误有用,例如禁用的Cookie),而是需要事件。 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();
        }
    };
}

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

答案 1 :(得分:1)

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

另一种可能性是您将看到“AbortError”,这意味着VERSION_CHANGE事务已中止。意味着导致中止的onupgradeneeded事件中存在错误。如果要创建已存在的对象库,则可以获得此结果。

我认为没有其他可能性,如果没有提供更多关于你得到的错误的信息。

答案 2 :(得分:0)

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

此外,您不能同时拥有autoincrementpath作为对象商店的选项。你必须选择其中一个。

以下是将您的示例发布的代码:

    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 addon-sdk编写的一些indexeddb代码。代码比您需要的更复杂,但您将能够看到所有需要发生的事件,错误和事务的顺序。 https://github.com/clarkbw/indexed-db-storage

祝你好运!

答案 3 :(得分:0)

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

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