You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 21:15:46