You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

开发浏览器扩展时IndexedDB报Uncaught NotFoundError如何解决?

IndexedDB报错原因排查

你遇到的NotFoundError由以下几个代码问题导致:

  • 核心错误:对象存储名称前后不一致。你在onupgradeneeded回调中创建的对象存储名称为webpage,但在onsuccess回调中调用tx.objectStore("URL")时使用了不存在的URL作为对象存储名,触发找不到存储的报错。
  • 索引创建逻辑错误:store.createIndex("link no.", "webpage", { unique: false })的第二个参数是需要索引的对象属性名,但你当前直接存储字符串类型的URL,不存在名为webpage的属性,该索引无法正常工作。
  • 变量作用域冲突:你在onupgradeneeded回调中用let重新声明了db、store、index变量,和外层的全局变量完全隔离,属于潜在逻辑隐患。
  • 存储结构不合理:直接存储字符串URL不利于后续的索引查询,建议改为存储带指定属性的对象。

修正后的完整代码

let request = window.indexedDB.open("MyTestDatabase", 1),
  db,
  tx,
  store,
  index;

request.onerror = function (e) {
  console.log("The database 'linkStorage' could not be opened");
};

request.onupgradeneeded = function (e) {
  // 直接使用外层变量,不要重复声明
  db = request.result;
  // 创建对象存储
  store = db.createObjectStore("webpage", { autoIncrement: true });
  // 索引对应存储对象的url属性
  index = store.createIndex("link no.", "url", { unique: false });
};

request.onsuccess = function (e) {
  db = request.result;

  tx = db.transaction("webpage", "readwrite");
  // 使用正确的对象存储名称webpage
  store = tx.objectStore("webpage");
  index = store.index("link no.");

  db.onerror = function (e) {
    console.log("ERROR" + e.target.errorCode);
  };

  // 存储为对象,匹配索引的属性设置
  var link = {url: location.href};
  store.put(link);
  tx.oncomplete = function () {
    db.close();
  };
};

注意:如果之前已经打开过版本为1的数据库,需要先在浏览器控制台的应用-存储-IndexedDB中删除旧的MyTestDatabase数据库,再重新运行代码,否则onupgradeneeded不会重新触发,新的存储和索引不会创建。

内容的提问来源于stack exchange,提问作者user13544328

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 22:57:04