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

Vite-React+Electron集成sqlite3时出现UnhandledPromiseRejectionWarning及数据库初始化失败问题

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();
}

三、验证修复效果

  1. 先删掉node_modules和package-lock.json(或者yarn.lock),重新安装依赖:
rm -rf node_modules package-lock.json
npm install
  1. 启动开发服务器npm run dev,应该就不会再出现那些警告,数据库也能正常连接了。

另外,如果你想用better-sqlite3的话,同样需要用electron-rebuild重新编译,原理是一样的哦。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.08 07:38:04