【问题标题】:Javascript, IndexedDB, storing Uint8Array, Giving ErrorJavascript,IndexedDB,存储 Uint8Array,给出错误
【发布时间】:2021-01-06 08:43:47
【问题描述】:

自从我开始阅读有关 IndexedDB 的内容以来已经有几个小时了,我遇到了一些问题。这是我从https://medium.com/@AndyHaskell2013/build-a-basic-web-app-with-indexeddb-8ab4f83f8bdahttps://gist.github.com/JamesMessinger/a0d6389a5d0e3a24814b 遵循的代码,为了理解起见,它只是放在一起很糟糕。所以我要做的是将密钥存储到 IndexedDB 中,以便我可以使用它来使用 ECIES 方案加密事物。

相关代码(先后顺序):

var secretKey = eccrypto.generatePrivate();

window.genSKey = function()
{
 openDB();
 console.log(secretKey);
 return;
}
window.openDB = function()
{
let db;
let dbReq = indexedDB.open('ln', 1);
dbReq.onupgradeneeded = function(event) {
  // Set the db variable to our database so we can use it!  
  db = event.target.result;

  // Create an object store named notes. Object stores
  // in databases are where data are stored.
  let skey = db.createObjectStore('skey', {keyPath: "id"});
}
dbReq.onsuccess = function(event) {
  db = event.target.result;

  setSkey(db);
  getSkey(db);

}
dbReq.onerror = function(event) {
  alert('error opening database ' + event.target.errorCode);
}
}

window.setSkey = function(db) {
    // Start a database transaction and get the notes object store
    let tx = db.transaction(['skey'], 'readwrite');
    let store = tx.objectStore('skey');
    // Put the sticky note into the object store
    store.put({id: 1, secretKey});
    // Wait for the database transaction to complete
    tx.oncomplete = function() { console.log('private key was saved') }
    tx.onerror = function(event) {
      alert('error storing private key ' + event.target.errorCode);
    }
  }

  window.getSkey = function(db)
  {
      // Set up an object store and transaction
let tx = db.transaction(['skey'], 'readonly');
let store = tx.objectStore('skey');
// Set up a request to get the sticky note with the key 1
let req = store.get(1);
// We can use the note if the request succeeds, getting it in the
// onsuccess handler
req.onsuccess = function(event) {
  let skey = event.target.result;
  if (skey) {
    console.log(skey);
  } else {
    console.log("skey 1 not found")
  }
}
// If we get an error, like that the note wasn't in the object
// store, we handle the error in the onerror handler
req.onerror = function(event) {
  alert('error getting note 1 ' + event.target.errorCode);
}

由于某种原因,在前端脚本中调用 genSKey 时,我收到以下控制台错误:

Uncaught DOMException: Failed to execute 'transaction' on 'IDBDatabase': One of the specified object stores was not found.
    at window.setSkey (http://127.0.0.1:5500/browserify/builds/genKey.js:26763:17)
    at IDBOpenDBRequest.dbReq.onsuccess (http://127.0.0.1:5500/browserify/builds/genKey.js:26752:3)
window.setSkey @ genKey.js:26763
dbReq.onsuccess @ genKey.js:26752
IndexedDB (async)
window.openDB @ genKey.js:26740
window.genSKey @ genKey.js:26601
signupData @ signup.html:186
onclick @ signup.html:64

控制台记录了更多内容,但其他内容与手头的问题无关。我不确定自己做错了什么,而且我整天都在做这件事。一些见解对我来说意味着世界,谢谢。

【问题讨论】:

    标签: javascript node.js database indexeddb uint8array


    【解决方案1】:

    您可能在没有对象存储的情况下创建了数据库。触发onupgradeneeded,它将创建对象存储,您必须连接到具有更高版本号的数据库。

    【讨论】:

    • 所以,只是为了确保我们在同一页面上let dbReq = indexedDB.open("ln", 1); 第二个参数需要更大的数字,然后它才会起作用?对象存储是在“setSkey()”中创建的,它被调用到“openDB()”的 onsuccess 函数中。
    • 它将工作......一次。您将不得不修改 onupgradeneeded 以便它可以对最新版本和新版本做出反应。是的,您必须创建对象存储,这样当您对其进行查询时,您就不会收到 object-store-not-found 类型的错误。
    • 你是一个利润,你能解释一下为什么改变db版本会得到这个结果吗?以及如何实现自动化。
    • 增加版本号会导致 indexedDb 在版本号更改时运行 onupgradeneeded。如果它永远不会改变它永远不会运行。您可能在没有此功能的情况下创建了数据库,然后从未增加版本。要自动化,请编写 onupgradeneeded 函数,然后在架构更改时使用新版本。
    猜你喜欢
    • 1970-01-01
    • 2020-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-15
    • 2019-02-02
    • 2020-08-17
    相关资源
    最近更新 更多