
该错误源于 MySQL 连接被服务端意外重置(如超时断开),而 Node.js 客户端未正确监听或处理连接关闭事件,导致未捕获的 ECONNRESET 异常崩溃进程。
该错误源于 mysql 连接被服务端意外重置(如超时断开),而 node.js 客户端未正确监听或处理连接关闭事件,导致未捕获的 `econnreset` 异常崩溃进程。
在 Node.js 中使用 mysql 或 mysql2 模块连接 MySQL 时,若仅建立单次连接(createConnection)且未监听底层网络事件,一旦连接因网络波动、服务端空闲超时(默认 wait_timeout = 8小时,但某些云数据库可能设为几分钟)、MySQL 重启或防火墙中断等原因被强制关闭,TCP 层会触发 ECONNRESET —— 此时若无错误处理器,Node.js 将抛出未捕获异常,直接终止进程。
✅ 根本解决思路:避免单点连接 + 主动错误捕获 + 自动恢复机制
1. 始终监听连接级错误事件
即使使用 createConnection,也必须监听 'error' 和 'close' 事件:
const mysql = require('mysql');
const connection = mysql.createConnection({ /* config */ });
connection.on('error', (err) => {
console.error('MySQL connection error:', err.code, err.sqlMessage);
if (err.code === 'PROTOCOL_CONNECTION_LOST') {
console.log('Attempting reconnect...');
connection.destroy(); // 清理旧连接
reconnect(); // 自定义重连逻辑
}
});
connection.on('close', () => {
console.warn('MySQL connection closed unexpectedly');
reconnect();
});⚠️ 注意:connection.on('error') 不能替代 try/catch 对查询操作的包裹,因为查询执行中的错误(如 SQL 语法错误)仍需单独捕获。
2. 推荐方案:改用连接池(Pooling)
连接池天然具备自动重连、连接复用、超时管理能力,是生产环境的标准实践:
const mysql = require('mysql');
const pool = mysql.createPool({
host: 'localhost',
user: 'root',
password: 'password',
database: 'test',
connectionLimit: 10, // 并发连接数上限(非必须为1)
waitForConnections: true,
queueLimit: 0, // 无限排队
acquireTimeout: 60000, // 获取连接超时(ms)
// 关键:启用自动重连(mysql2 默认开启,原生 mysql 需配合事件)
});
// 使用示例(自动从池中获取/释放连接)
pool.query('SELECT NOW()', (err, results) => {
if (err) throw err;
console.log(results);
});? 提示:若只需单连接但希望自动恢复,可设 connectionLimit: 1,池仍会接管重连逻辑,无需手动实现。
3. 同步配置服务端空闲超时(可选但推荐)
检查 MySQL 服务端 my.cnf 中的超时参数,避免客户端连接被静默断开:
[mysqld] wait_timeout = 28800 # 单位:秒(默认8小时) interactive_timeout = 28800
云数据库(如 AWS RDS、阿里云 RDS)通常限制更短(如 300 秒),此时务必确保客户端连接池的 acquireTimeout 和重试策略匹配。
总结
- ❌ 避免裸用
createConnection()且不监听'error'/'close'; - ✅ 优先采用
createPool(),它内置健壮的连接生命周期管理; - ✅ 所有异步数据库操作必须配合错误回调或 Promise
.catch(); - ? 结合服务端
wait_timeout调优,形成端到端的连接稳定性保障。
通过以上三步,即可彻底消除 Uncaught Error: read ECONNRESET,让应用在真实网络环境中稳定运行。


















