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

Node.js中无法关闭Mongoose连接问题求助

解决Mongoose连接无法关闭的问题

核心问题

你遇到的问题是process.exit()执行时机过早——Mongoose的close()和disconnect()都是异步操作,进程在断开连接的操作完成前就被终止,导致连接没有正常关闭。

解决方案

1. 调整进程终止时机,等待断开操作完成

修改disconnectDB函数,允许传入回调,确保断开成功后再终止进程:

const disconnectDB = function (callback) {
  if (!db) {
    console.log('No active Mongoose connection to disconnect');
    return callback();
  }

  db.close(function (err) {
    if (err) {
      console.error('Failed to disconnect Mongoose connection:', err);
      return callback(err);
    }
    console.log('Mongoose default connection disconnected through app termination');
    callback();
  });
};

然后在index.js中修改SIGINT事件处理逻辑,等待断开完成后再退出:

process.on('SIGINT', () => {
  disconnectDB(() => {
    process.exit(0);
  });
});

2. 改用Promise/Async-Await方式(更简洁)

Mongoose的close()方法支持Promise,可以用async/await简化代码:

const disconnectDB = async function () {
  if (!db) {
    console.log('No active Mongoose connection to disconnect');
    return;
  }

  try {
    await db.close();
    console.log('Mongoose default connection disconnected through app termination');
  } catch (err) {
    console.error('Failed to disconnect Mongoose connection:', err);
  }
};

对应的index.js处理:

process.on('SIGINT', async () => {
  await disconnectDB();
  process.exit(0);
});

额外检查点

  • 确认db变量已正确赋值:mongoose.connection是单例对象,即使在连接完成前赋值,后续也会指向正确的连接实例,但在disconnectDB中增加非空判断可以避免无连接时的报错。
  • 如果存在多个Mongoose连接实例,建议使用mongoose.disconnect()关闭所有连接,同样要等待异步操作完成。

内容的提问来源于stack exchange,提问作者Avinash A

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 22:45:38