Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 未捕获的InvalidStateError:未能执行';交易';在';IDB数据库';:正在运行版本更改事务_Javascript_Transactions_Indexeddb - Fatal编程技术网

Javascript 未捕获的InvalidStateError:未能执行';交易';在';IDB数据库';:正在运行版本更改事务

Javascript 未捕获的InvalidStateError:未能执行';交易';在';IDB数据库';:正在运行版本更改事务,javascript,transactions,indexeddb,Javascript,Transactions,Indexeddb,我必须承认我对IndexedB很陌生 我编写了一个简单的indexedDB代码,如下所示: function go() { var req = window.indexedDB.open("Uploader", 1), db; req.onerror = function (e) { console.log("Error"); }; req.onsuccess = function (e) { d

我必须承认我对IndexedB很陌生

我编写了一个简单的
indexedDB
代码,如下所示:

function go() {
   var req = window.indexedDB.open("Uploader", 1),
      db;
   req.onerror = function (e) {
      console.log("Error");
   };
   req.onsuccess = function (e) {
      db = e.target.result;
   };
   req.onupgradeneeded = function (e) {
      console.log(db);
      db = e.target.result;
      var os = db.createObjectStore("Files", { keyPath: "files" });
      os.createIndex("text", "text_file", { unique: false });
      var trans = db.transaction(["text"], "readwrite");
      var objectstore = trans.objectStore("text");
      var addreq = objectstore.add("Instructions.js");
      addreq.onsuccess = function (e) {
         console.log("Success!");
         console.dir(e);
      };
   };
}
它给我的错误是
Uncaught InvalidStateError:未能在“IDBDatabase”上执行“transaction”:正在运行版本更改事务。

据说,
版本更改事务正在运行
,但据我所研究,版本更改事务是从
IDBFactory.open
方法进行的,我没有使用,我已经指定此事务是
readwrite
,此事务在
onupgradeneeded
中,那么为什么会出现错误


我必须承认,我对indexedDB非常陌生,versionchange事务也允许您读写。您只需要访问在onupgradeneeded函数中为您创建的事务

function go() {
  var req = indexeddb.open(...);
  req.onupgradeneeded = function(event) {

    // note that event.target === req === this, use whatever you like
    var db = event.target.result;

    // createObjectScore implicitly uses the versionchange txn running 
    // here, without telling you, basically a convenience function
    var objectStore = db.createObjectStore(...);

    // the important part that i am describing in this answer, 
    // grab the handle of the versionchange txn 
    // that is already running and was created for you
    // note again that event.target === req, you could just do
    // req.transaction or this.transaction here.
    // note this is a property of the open request, not a method. do NOT
    // confuse this with the method transaction() that is used to create a 
    // new transaction.
    var txn = event.target.transaction;

    // note that txn.objectStore(...) will work here, because the 
    // createObjectStore call earlier guarantees the store exists here
    // within the implicit upgrade txn
    var addRequest = txn.objectStore(...).add('value');

    // side note: if in previous line we did:
    // var objectStoreRetrievedFromTxn = txn.objectStore(...);
    // then that variable is equal to the same variable returned from 
    // db.createObjectStore earlier in this function. Both are simply handles 
    // (references, pointers, whatever you want to call it) to the store.

    // kind of dumb, but you could do this just to log something
    addRequest.onsuccess = function() {console.log('Success!');};
  };

  // called once upgrade txn completes (if it even needed to run), 
  // and db is opened
  req.onsuccess = function(event) {
    console.log('upgrade txn completed and db is now connected');
    // here, create whatever readwrite or readonly txns you want, note these 
    // txns are separate from and different than the versionchange txn from 
    // before, because that is a unique transaction only available within 
    // onupgradeneeded. however, both versionchange and readwrite are similar
    // in that both support calls to put or add
  };
}

您遇到错误是因为您试图在版本更改事务仍在运行时启动第二个事务。

在版本更改中,您不需要为事务指定范围。这始终是所有prenset对象存储。
transaction.objectStore('text')
如果您试图打开一个具有索引名称的对象存储,这将不起作用。如果要访问索引,需要先转到objectstore

需要在objectstore上添加数据

function go(){var req = window.indexedDB.open("Uploader", 1), db;
req.onerror=function(e){console.log('Error')};
req.onsuccess = function(e){db=e.target.result;};
req.onupgradeneeded = function(e){
    console.log(db);
    db=e.target.result;
    var trans=e.target.transaction;
    var os = db.createObjectStore('Files', {keyPath:"files"});
        os.createIndex('text', 'text_file', {unique:false})
    var objectstore=  trans.objectStore("Files");
    var addreq = objectstore.add('Instructions.js');
        addreq.onsuccess = function(e)  {console.log('Success!');console.dir(e)}
}}

尝试一下

在尝试加载对象存储之前,您需要检查版本更改事务是否完成:

request.onupgradeneeded =
    function(event) {
        db = event.target.result;
        var store = db.createObjectStore('Files', {keyPath:"files"});
        var transaction = event.target.transaction;

        transaction.oncomplete =
            function(event) {    
                // Now store is available to be populated
            }
    }

但是我如何指定事务的范围?它给了我一个错误
Uncaught NotFoundError:在'IDBTransaction'上执行'objectStore'失败:找不到指定的对象存储。
在'transaction.objectStore('text'行)`