Node.js Express中MySQL重连触发ER_ACCESS_DENIED_ERROR错误的解决方案咨询
解决MySQL连接重连时的ER_ACCESS_DENIED_ERROR问题
你遇到的循环权限错误,核心问题是重连逻辑没有正确复用数据库连接配置,导致重连时使用了空的用户名和密码。让我一步步帮你修正:
问题根源
你原来的重连代码里写了:
db = mysql.createConnection(db.db);
这里的db.db是完全不存在的——mysql.createConnection()返回的连接对象里并没有db这个属性,等于你传给createConnection一个undefined,它会默认用空用户名、localhost地址、无密码去连接,自然就触发了Access denied for user ''@'localhost'的错误。
修正后的完整代码
我们先把数据库配置单独抽成变量,同时优化重连逻辑(比如判断错误类型、添加重试延迟):
var express = require('express'); const mysql = require("mysql"); // 1. 把数据库配置单独抽成变量,方便重连时复用 const dbConfig = { host: 'ipaddress', user: 'username', password: 'password', database: 'my77admin' }; // 2. 创建初始连接 var db = mysql.createConnection(dbConfig); // 3. 改进后的重连处理函数 function handleDisconnect() { db.connect(function (err) { if (err) { console.log('连接失败,5秒后重试:', err.stack); // 延迟重试,避免频繁请求数据库 setTimeout(handleDisconnect, 5000); return; } console.log("数据库连接成功!"); }); db.on('error', function (err) { console.log('数据库连接出错:', err.stack); // 只在连接丢失类错误时重连,避免无效循环 if (err.code === 'PROTOCOL_CONNECTION_LOST' || err.code === 'ECONNRESET') { console.log('连接丢失,尝试重连...'); // 销毁旧连接,重新创建新连接 db.destroy(); db = mysql.createConnection(dbConfig); handleDisconnect(); } else { // 其他错误(比如权限错误)直接抛出,避免无限循环 throw err; } }); } // 启动重连处理 handleDisconnect(); module.exports = db;
关键改进点
- 抽离配置变量:把连接配置单独存为
dbConfig,确保每次重连都用正确的账号密码。 - 错误类型过滤:只在连接丢失(
PROTOCOL_CONNECTION_LOST)或连接被重置(ECONNRESET)时触发重连,像权限错误这类配置问题直接抛出,避免无效循环。 - 添加重试延迟:重连失败时延迟5秒再尝试,避免短时间内大量请求给数据库造成压力。
- 简化逻辑:去掉冗余的参数传递,直接复用全局的
db变量和dbConfig,代码更清晰。
额外建议
- 如果你用的是较新版本的Node.js,推荐改用
mysql2模块,它自带连接池功能,能更优雅地处理连接断开和重连,比手动写重连逻辑更可靠。 - 检查数据库服务器的
wait_timeout和interactive_timeout配置,避免服务器主动断开空闲连接过于频繁。
内容的提问来源于stack exchange,提问作者Hong Ernest
相关产品推荐
相关产品推荐

