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

Electron生产环境MySQL连接失败:用户权限拒绝错误排查

生产环境Electron应用MySQL连接失败排查与解决

问题概述

基于Electron.js开发的应用,使用electron-forge完成生产构建后,MySQL数据库无法连接,报错提示用户为空;但开发环境(npm start)下连接正常。

错误日志

Error connecting to database: Error: Access denied for user ''@'localhost' (using password: YES)
at Object.createConnection (C:\Users\callo\OneDrive\Desktop\Invoice-Generator-using-Electron.js\node_modules\mysql2\promise.js:253:31)
at connectToDB (C:\Users\callo\OneDrive\Desktop\Invoice-Generator-using-Electron.js\main.js:50:34) {
code: 'ER_ACCESS_DENIED_ERROR',
  errno: 1045,
  sqlState: '28000'
}

核心代码片段(main.js)

const { app, BrowserWindow, ipcMain } = require("electron");
const path = require("path");
const mysql = require("mysql2/promise");
const ExcelJS = require("exceljs");
const { shell } = require('electron');  

// 环境变量加载逻辑
if (process.env.NODE_ENV === 'development') {
    require('dotenv').config({ path: '.development.env' });
} else if (process.env.NODE_ENV === 'production') {
    require('dotenv').config({ path: '.production.env' });
}

// 数据库连接函数
async function connectToDB() {
    try {
        connection = await mysql.createConnection({
            host: process.env.DB_HOST,
            user: process.env.DB_USER,
            password: process.env.DB_PASSWORD,
            database: process.env.DB_DATABASE,
        });
    } catch (error) {
        console.error("Error connecting to database:", error);
    }
}

app.whenReady().then(connectToDB);

环境配置文件

开发环境 .development.env

DB_HOST=localhost
DB_USER=test    
DB_PASSWORD=********
DB_DATABASE=invoice

生产环境 .production.env

DB_HOST=localhost
DB_USER=test    
DB_PASSWORD=********
DB_DATABASE=invoice

排查与解决步骤

  • 确认生产环境NODE_ENV变量设置
    electron-forge构建生产包时,不会自动将NODE_ENV设为production,导致代码无法加载.production.env。需在构建命令中手动指定:

    • Windows:在package.json的scripts中修改为 "make": "set NODE_ENV=production && electron-forge make"
    • macOS/Linux:修改为 "make": "NODE_ENV=production electron-forge make"
  • 确保生产环境.env文件被正确打包
    electron-forge默认不会打包根目录的.env文件,需在forge.config.js中配置额外资源打包:

    module.exports = {
      packagerConfig: {
        extraResource: ['.production.env']
      },
      // 其他原有配置...
    };
    

    同时调整main.js中的env文件路径,适配打包后的目录结构:

    const envPath = process.env.NODE_ENV === 'development' 
      ? path.join(__dirname, '.development.env')
      : path.join(process.resourcesPath, '.production.env');
    require('dotenv').config({ path: envPath });
    
  • 验证MySQL用户权限
    确认test用户拥有localhost的连接权限,执行MySQL命令:

    SELECT user, host FROM mysql.user WHERE user = 'test';
    

    若host不为localhost或%,执行授权命令:

    GRANT ALL PRIVILEGES ON invoice.* TO 'test'@'localhost' IDENTIFIED BY '你的数据库密码';
    FLUSH PRIVILEGES;
    
  • 添加调试验证
    在生产环境启动时,打印环境变量确认是否加载成功:

    console.log('Loaded DB_USER:', process.env.DB_USER);
    

内容的提问来源于stack exchange,提问作者PARTH PETKAR

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 08:23:38