Node.js中MySQL连接意外关闭的原因排查求助
问题排查:MySQL连接意外关闭的原因分析
核心问题:异步操作未等待完成就关闭连接
你遇到的Error: Can't add new command when connection is in closed state错误,根源出在调用代码的异步处理逻辑上:
调用者代码中,dboObj.getOldNetworkReport(startDate)是异步函数,返回Promise,但你直接return这个Promise却没有用await等待它执行完成。finally块会在try块代码执行后立刻触发,导致数据库连接在两次SQL查询完成前就被关闭了——第一次查询可能刚结束,第二次查询还没开始,连接已经被dboObj.close()关掉,自然会报错。
其他潜在问题与修复方案
1. 修复调用者的异步等待逻辑
将调用代码改成异步函数,用await等待报告查询完成后再关闭连接:
async function getReport(startDate) { let dboObj = new DBO(); try { return await dboObj.getOldNetworkReport(startDate); } catch (error) { console.log("==============================="); console.log("获取旧网络报告数据时出错:"); console.log(error.stack); console.log("==============================="); } finally { dboObj.close(); }; }
2. 修复类内未声明的全局变量
getOldNetworkReport函数里的result变量没有用let/const声明,会变成全局变量,存在污染风险,需要在函数内声明:
this.getOldNetworkReport = async reportPeriod => { let result; // 声明变量 sqlString = "select * from network_service_pledge_performance where report_period=?"; // ... 后续代码不变 }
3. 避免修改全局DbConfig对象
构造函数中直接修改了全局导出的DbConfig对象,如果其他模块也使用这个配置,会受到影响。应该创建配置副本再修改:
constructor() { // 创建配置副本,不修改全局对象 const dbConfigCopy = { ...DbConfig, multipleStatements: true, insecureAuth: true }; const connection = mysql.createConnection(dbConfigCopy); // ... 后续代码不变 }
内容的提问来源于stack exchange,提问作者The KNVB
相关产品推荐
相关产品推荐

