Javascript 在Firefox中打开IndexedDB时出现InvalidStateError

Javascript 在Firefox中打开IndexedDB时出现InvalidStateError,javascript,firefox,indexeddb,Javascript,Firefox,Indexeddb,在Firefox 17.0.1中,当我尝试打开IndexedDB数据库时,Firebug控制台向我显示InvalidStateError异常。还引发了request.onerror事件,但未定义event.target.errorCode 有没有人有在Firefox中使用IndexedDB的经验 更新 Firefox 18.0.1也有同样的行为 我非常确定您得到的错误是版本错误,这意味着数据库的当前版本高于您打开数据库时使用的版本。如果查看event.target.error,您将看到名称将包含

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

有没有人有在Firefox中使用IndexedDB的经验

更新


Firefox 18.0.1也有同样的行为

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

另一种可能性是您将看到“AbortError”,这意味着版本更改事务被中止。这意味着OnUpgradeRequired事件中存在导致中止的错误。如果您正在创建一个已经存在的对象存储,您可能会得到这个结果


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

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

此外,对象存储中不能同时使用
自动增量
路径
。你必须选择其中一个

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

    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/>');
        };
    }
函数initDB(){
if(window.indexedDB){
var请求=window.indexedDB.open('demo',1);
request.onsuccess=函数(事件){
db=event.target.result;
createObjectStore();
};
request.onupgradeneeded=函数(事件){
db=event.target.result;
$(“#消息”).prepend('blah blah
'); }; request.onerror=函数(事件){ $('#messages').prepend('Chyba databáze'+event.target.errorCode+'
'); }; } } 函数createObjectStore(){ db.close(); var请求=window.indexedDB.open('demo',2); request.onsuccess=函数(事件){ db=event.target.result; showDB(); }; request.onupgradeneeded=函数(事件){ db=event.target.result; $(“#消息”).prepend('yes-yes-yes
'); var store=db.createObjectStore('StoreName',{keyPath:'id'}); createIndex('IndexName','id',{unique:true}); }; request.onerror=函数(事件){ $('#messages').prepend('Chyba databáze'+event.target.errorCode+'
'); }; }
如果您开始陷入困境,可以看看我为Firefox插件sdk编写的一些indexeddb代码。代码比您需要的更复杂,但您将能够看到所有需要发生的事件、错误和事务顺序


祝你好运

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

  • 在私有模式下使用Firefox
  • 或者在不同的Firefox版本之间切换(,)
要防止InvalidStateError,try catch不起作用(但对其他错误很有用,例如禁用的Cookie),您需要event.preventDefault()。是的,我知道,这太容易了


值得称赞。

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

我相信FireFox基本上是在匿名模式下运行的。
IndexedDB在私有模式下运行FireFox时不可用。

Hi,我在FF 17.0.1上测试了它,它对我也有效,在19.0.1上也是如此。你确定没有其他问题吗?可能您浏览器上db的当前版本高于1,这就是为什么会出现错误?尝试在更高版本中打开db,查看它是否工作。我尝试在另一个域上运行代码,但错误相同。当我在Firebug中调试JS时,
onupgradeneeded
没有被激发。Kristof说的是,你需要打开数据库而不使用version属性。这就是你得到版本错误的原因。丹尼是正确的。通过调用不带版本号的open方法,您将以其当前版本打开数据库。完成后,您应该能够使用event.target.result.version在成功句柄中检查数据库的当前版本删除版本号没有帮助。Mozila的IndexedDB演示中有一个版本号:当您没有提供版本号时,会出现什么错误?您是否查看了event.target.error以查看得到的错误?你可以做的另一件事是获取我的包装器和查看器。使用my viewer,您将能够获得数据库的详细信息。在上,您将找到我的库和查看器。在我的博客上你会发现如何使用它。
    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/>');
        };
    }
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();
        }
    };
}