Angular中使用Dexie导出IndexedDB报错:storeNames参数为空
解决Dexie(Angular)导出IndexedDB的问题
错误原因分析
1. InvalidAccessError: Failed to execute 'transaction' on 'IDBDatabase': The storeNames parameter was empty.
核心问题:
new Dexie()不是异步操作,不能用await直接修饰,你初始化数据库的方式有误。- 数据库未正确打开,或者数据库内没有任何对象仓库(表),导致
exportDB无法创建包含有效表的事务。
2. TypeError: db.export is not a function
核心问题:
你未将dexie-export-import的扩展注册到Dexie原型上,因此Dexie实例不会自带export方法。
正确解决方案
方案一:使用exportDB函数(正确初始化数据库)
先确保数据库正确初始化、打开,且存在至少一个表:
import Dexie from 'dexie'; import { exportDB } from 'dexie-export-import'; // 1. 定义Dexie实例并指定表结构(已有数据库需匹配现有结构) const db = new Dexie('myDB'); db.version(1).stores({ // 替换为你的实际表结构,示例: users: 'id, name, email' }); // 2. 打开数据库 await db.open(); // 3. 执行导出 const blob = await exportDB(db);
如果是已有数据库,可简化表结构定义(仅声明表存在):
db.version(1).stores({ users: null // 表示该表已存在,无需定义字段 });
方案二:使用db.export()方法(需扩展Dexie)
要使用实例方法export,需先注册扩展:
import Dexie from 'dexie'; import { extend } from 'dexie-export-import'; // 关键步骤:扩展Dexie原型,添加export方法 extend(Dexie); // 初始化数据库(同方案一) const db = new Dexie('myDB'); db.version(1).stores({ users: 'id, name, email' }); await db.open(); // 执行导出(可配置导出选项) const options = { includeData: true // 可选:是否包含表数据,默认true }; const blob = await db.export(options);
额外注意事项
- 确保
dexie与dexie-export-import版本兼容,建议安装同系列版本(如均使用3.x版本)。 - 若数据库确实无任何表,导出操作无意义,需先创建至少一个表再尝试导出。
内容的提问来源于stack exchange,提问作者Madara Uchiha
相关产品推荐
相关产品推荐

