为什么我的新 objectStores 没有在现有的 indexedDB 上创建?

Why are my new objectStores not being created on existing indexedDB?

我有一个现有的 indexedDb,我需要向它添加几个新的 objectStores。

我正在增加版本号,并在 onupgradeneeded 函数中构建 objectStores(如果它们尚不存在)。

            var db;
            var dbName = 'dev';
            var request = window.indexedDB.open(dbName, 2);

            request.onblocked = function(event) {
                // 
            };

            request.onerror = function (event) {
                //
            };

            request.onsuccess = function (event) {
                db = request.result;
            };

            request.onupgradeneeded = function (event) {
                var db = event.target.result;
                console.log(`Upgrading to version ${db.version}`);
                if (!db.objectStoreNames.contains('existing_store_1')) {
                    var existingStore1 = db.createObjectStore('existing_store_1', {keyPath: 'id'});
                }
                if (!db.objectStoreNames.contains('existing_store_2')) {
                    var existingStore2 = db.createObjectStore('existing_store_2', {keyPath: 'id'});
                }
                if (!db.objectStoreNames.contains('new_store_1')) {
                    var newStore1 = db.createObjectStore('new_store_1', {keyPath: 'id'});
                }
                if (!db.objectStoreNames.contains('new_store_2')) {
                    var newStore2 = db.createObjectStore('new_store_2', {keyPath: 'id'});
                }
            };

            return db;

当我刷新站点时,数据库版本确实跳转到了新版本号,但是没有创建新的 objectStores。如果我删除数据库并刷新,它会创建包含所有 objectStores 的数据库,包括新的。

显然,我需要新用户使用所有 objectStores 构建整个数据库,而现有用户在不删除现有数据库的情况下构建新的 objectStores。

我做错了什么?

我看过这个 但它没有回答我的问题。

我的第一个猜测,它与return db;有关。这表明您可能正在尝试同步使用它,而不是等待事情发生,并且您可能持有对 IDBDatabase 变量的先前实例而不是新实例的引用。我这么说的部分原因不是因为它特定于您的代码,而是因为 idb ops 往往是异步的,而异步对于许多开发人员来说很难,并且是一个常见问题。

尝试以下方法,看看是否有帮助。首先,不再使用全局 var db 变量。其次,编写一个如下所示的连接函数:

function connect(callbackFunction) {
   var openRequest = ...;
   openRequest.onupgradeneeded = ...;
   openRequest.onsuccess = function(event) {
     var db = event.target.result;
     callbackFunction(db);
   };
}

// Now to use it, you can only refer to db from within the callback

connect(function onConnected(db) {
  console.log('Use the db variable inside the function');
});

console.log('never try to use the db variable here');