Vite-React+Electron集成sqlite3时出现UnhandledPromiseRejectionWarning及数据库初始化失败问题
嘿,我来帮你拆解下遇到的这两个核心问题,咱们一步步来解决:
一、先搞定ReferenceError: __filename is not defined的报错
你现在手动给global赋值__filename和__dirname的方式有点小问题——Vite默认用ES模块,而这俩变量是CommonJS环境的产物,直接给全局对象赋值容易在异步上下文里出问题,导致未处理的Promise拒绝。咱们换个更规范的写法,直接定义局部变量就行:
import { fileURLToPath } from 'node:url'; import path from 'node:path'; // 直接定义局部变量,不用碰global const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename);
这样就能彻底解决这个未定义的警告了。
二、解决sqlite3数据库初始化失败的核心坑
这是Electron集成原生Node模块的经典问题!主要原因是sqlite3的预编译二进制文件和Electron自带的Node版本不匹配——你装的sqlite3是适配系统Node版本的,但Electron自己带了一套Node环境,版本大概率不一样,所以得重新编译适配。
步骤1:安装必要工具
先确保你装了electron-rebuild(专门用来给Electron重新编译原生模块的工具)和sqlite3:
npm install sqlite3 electron-rebuild --save-dev
步骤2:配置自动编译脚本
在package.json里加一个postinstall脚本,每次安装依赖后自动帮你编译sqlite3:
"scripts": { "dev": "...", // 保留你原来的dev脚本 "build": "...", // 保留原来的build脚本 "postinstall": "electron-rebuild" }
然后执行一次这个脚本,让它先把sqlite3编译好:
npm run postinstall
步骤3:修正数据库路径
你之前写的数据库路径可能在开发/打包环境下不一致,建议用Electron官方推荐的用户数据目录来存数据库,避免路径混乱:
import { app } from 'electron'; // 替换原来的dbPath定义,用app.getPath获取安全的存储路径 const dbPath = path.join(app.getPath('userData'), 'Aura.db');
这个目录是系统给应用分配的专属存储区,不管是开发还是打包后都能正常访问。
步骤4:优化数据库初始化的异步逻辑
你之前在数据库构造后立刻同步执行表检查是有问题的——sqlite3的Database构造是异步的,还没等连接建立完成你就查表格,肯定会出错。咱们把表检查放到连接成功的回调里:
try { db = new sqlite3.Database(dbPath, (err) => { if (err) { console.error('Failed to connect:', err); app.quit(); return; } console.log('Connected to SQLite'); // 等连接成功后再检查表 db.get("SELECT name FROM sqlite_master WHERE type='table' AND name='products'", (err, row) => { if (err) { console.error('Failed to check table:', err); app.quit(); return; } if (!row) { console.error('Products table does not exist'); app.quit(); return; } console.log('Products table exists'); }); }); } catch (error) { console.error('DATABASE INITIALIZATION FAILED:', error); app.quit(); }
三、验证修复效果
- 先删掉
node_modules和package-lock.json(或者yarn.lock),重新安装依赖:
rm -rf node_modules package-lock.json npm install
- 启动开发服务器
npm run dev,应该就不会再出现那些警告,数据库也能正常连接了。
另外,如果你想用better-sqlite3的话,同样需要用electron-rebuild重新编译,原理是一样的哦。
内容来源于stack exchange

