无法从服务工作者访问indexeddb。

5

我已经将数据存储在IndexedDB中,现在想在Service Worker中访问这些数据。但是打开IndexedDB的请求一直处于等待状态,因此我无法访问数据。需要帮助解决这个问题。以下是我的代码,用于从Service Worker访问数据。

var idbSupported = false;
var db;
self.addEventListener('push', function(){
 if("indexedDB" in self) {
     idbSupported = true;
  }else{ console.log('Indexed db not supported');}
  if(idbSupported) {
     var openRequest = indexedDB.open("test",1);
     openRequest.onupgradeneeded = function(e) {
        console.log("Upgrading...");
        var thisDB = e.target.result;
        if(!thisDB.objectStoreNames.contains("users")) {
            thisDB.createObjectStore("users", { autoIncrement: true });
        }
    } 
    openRequest.onsuccess = function(e) {
        console.log("Success!");
        db = e.target.result;
        readUser();
    }
    openRequest.onerror = function(e) {
        console.log("Error");
        console.dir(e);
    }
  }
},false);

 function readUser(){
  var transaction = db.transaction(["users"], "readwrite");
  var store = transaction.objectStore("users");
  var request = store.get(user_id);
  request.onerror = function() {
  console.log("Error");

 }
request.onsuccess = function() {
 console.log("Yolo! Did it");
 }
 }

你是通过Chrome扩展程序来做这件事吗?如果是的话,请注意您需要在清单文件中授予“storage”或“unlimitedStorage”权限,否则服务工作者将会收到误导性的访问错误。 - Volomike
1个回答

4
如果我将您的代码从push事件监听器中提取出来,并在服务工作者中无条件地运行它,它将成功运行。我不确定您所看到的是什么原因,但也许push事件并没有像您期望的那样被触发?
如果您正在寻找一些通用代码,以展示如何在服务工作者中使用IndexedDB,https://github.com/GoogleChrome/samples/blob/gh-pages/service-worker/offline-analytics/service-worker.js是一个可能有所帮助的示例。但我认为您发布的代码基本上是可行的。
另外,从您的服务工作者中检查'indexedDB' in self应该是没有必要的。IndexedDB在Chrome和Firefox的服务工作者实现中都可用,我非常相信未来任何其他支持服务工作者的浏览器也会在其实现中公开IndexedDB。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接