Electron+React+SQLite获取用户报错:Cannot read properties of undefined (reading 'getUsers')
错误排查与修复方案
核心错误原因:模块引用文件名不匹配
你遇到的TypeError: Cannot read properties of undefined (reading 'getUsers'),最直接的诱因是文件名拼写不一致:
- 数据库操作文件实际命名为
dbmng.js - 但在
main.js中你写了const dbmgr = require('../src/models/dbmgr');,这里的dbmgr和实际文件名dbmng拼写错误,导致模块加载失败,dbmgr变量为undefined,自然无法调用getUsers方法。
修复步骤1:修正模块引用
将main.js中的引用语句改为:
const dbmgr = require('../src/models/dbmng'); // 匹配实际文件名dbmng
其他潜在问题与修复
除核心错误外,代码还有几处细节需要修正,避免后续出现异常:
1. dbmng.js中未定义变量引用
在getUsers函数里,你写了console.log('Users data:', users);,但users变量从未定义,应替换为查询结果res:
// 原错误代码 console.log('Users data:', users); // 修正后 console.log('Users data:', res);
2. preload.js中Promise未处理错误场景
当前的getUsers仅监听了成功的usersData响应,若主进程出现异常,前端无法捕获错误。建议添加超时和错误监听:
contextBridge.exposeInMainWorld('api', { getUsers: () => { return new Promise((resolve, reject) => { // 添加超时处理,避免无响应 const timeout = setTimeout(() => { reject(new Error('请求超时')); }, 5000); ipcRenderer.once('usersData', (_, data) => { clearTimeout(timeout); resolve(data); }); // 监听主进程发送的错误事件 ipcRenderer.once('getUsersError', (_, errorMsg) => { clearTimeout(timeout); reject(new Error(errorMsg)); }); ipcRenderer.send('getUsers'); }); }, });
对应的主进程可在catch块中新增错误事件发送:
ipcMain.on('getUsers', async (event) => { try { const users = await dbmgr.getUsers(); event.reply('usersData', users); } catch (error) { console.error('Error retrieving users:', error); event.reply('getUsersError', error.message); event.reply('usersData', []); } });
3. 删除dbmng.js中不必要的提前调用
你在dbmng.js末尾写了console.log(getUsers()),这会在模块加载时自动执行数据库查询,属于不必要的启动请求,建议删除该行代码。
验证修复
- 确认所有文件名与引用路径完全一致
- 修正上述所有代码问题
- 重启Electron应用,检查前端是否能正常渲染用户数据
内容的提问来源于stack exchange,提问作者rorot_23
相关产品推荐
相关产品推荐

