Dexie调用get方法返回undefined且db.geo未定义问题求助
问题原因
- 核心错误为表名不匹配:你通过
db.version(1).stores()配置的表名为data,Dexie会自动将表实例挂载到db.data属性下,代码中全程访问不存在的db.geo属性,自然返回undefined,调用其方法就会抛出对应类型错误。 - 语法错误:定义的
data函数未添加async关键字,函数内部直接使用await会触发语法错误,无法正常执行。 - 逻辑漏洞:仅在数据库不存在时执行表配置,若设备上已存在旧版本的
data数据库,且旧版本未定义对应表,未做版本升级处理的情况下,就算表名填写正确也会出现表实例不存在的问题。 - 你提到的“数据已经全部成功插入”属于测试过程中本地缓存未清理的假象,大概率是之前测试时遗留了配置过
geo表的旧版本数据库,当前提供的代码逻辑不可能完成db.geo.bulkPut写入操作。
修正方案
- 确保表配置的键名和实际访问的表名一致,如果需要使用
geo作为表名,修改表配置如下:
await db.version(1).stores({ geo: 'id,name' });
- 给使用
await的函数添加async关键字 - 无需额外判断数据库是否存在,Dexie原生支持初始化时直接声明版本和表结构,会自动比对本地版本完成初始化或升级操作,更规范的参考代码如下:
const db = new Dexie('data'); const dataToInsert = [{id: "aaaa", name: "bbb"}] // 直接声明版本和表结构 db.version(1).stores({ geo: 'id,name' }); async function handleData() { const exists = await Dexie.exists("data"); if (!exists) { await db.geo.bulkPut(dataToInsert); } const record = await db.geo.get("aaaa"); console.log(record); }
如果不需要兼容旧数据,遇到结构不匹配的问题可以先删除本地IndexedDB缓存再测试,避免旧数据干扰。
内容的提问来源于stack exchange,提问作者13Akaren
相关产品推荐
相关产品推荐

