为何Node.js的MySQL查询导致程序无法正常终止?
问题原因与解决方案
确实是数据库连接池导致脚本无法自动终止。
原因
你使用的mysql模块连接池会维持若干空闲连接(即使查询已完成),这些活跃连接会占用Node.js事件循环,阻止进程自动退出——只有当事件循环中没有待处理任务时,Node.js才会终止进程。
解决办法
根据你的脚本类型选择对应方案:
1. 一次性脚本(执行完即结束)
在查询完成(或出错)后,调用连接池的end()方法关闭所有连接,释放资源:
修改getPlayers函数:
const getPlayers = () => { return new Promise((resolve, reject) => { db.query('SELECT * FROM cc_players', (err, res) => { if (err) { console.log(err); // 出错时关闭池并reject db.end(); return reject(err); } resolve(res); // 查询完成后关闭连接池 db.end(); }) }) }
或者在调用getPlayers的主逻辑中处理:
getPlayers() .then(players => { // 处理查询结果 console.log(players); // 处理完成后关闭池 db.end(); }) .catch(err => { console.error(err); // 出错也需关闭池 db.end(); });
2. 长期运行服务(如API服务器)
不需要关闭连接池,连接池的作用就是复用连接提升性能,此时进程会持续运行以处理后续请求。
额外优化点
原getPlayers函数中,错误发生时仅打印日志但未rejectPromise,会导致调用方无法捕获错误,建议补充reject逻辑(如上述代码所示)。
内容的提问来源于stack exchange,提问作者Tom Davies
相关产品推荐
相关产品推荐

