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"
- Windows:在package.json的scripts中修改为
确保生产环境.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
相关产品推荐
相关产品推荐

