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

Jest测试中Mongoose与Koa服务器无法关闭连接问题排查

解决Jest测试后Node脚本无法终止、MongoDB连接未彻底关闭的问题

我之前也碰到过一模一样的情况——明明控制台打印了Mongo连接关闭,测试也跑成功了,但Node脚本就是停不下来,Mongo CLI里的连接数也没变化。咱们一步步来排查解决:

1. 先确保异步关闭逻辑被正确等待

mongoose.disconnect()和服务器的close()都是异步操作,要是你在afterAll里没通过async/await或者.then()等待它们完成,控制台的“连接已关闭”可能只是触发了关闭动作,但实际还没彻底完成。先把你的afterAll改成这样:

afterAll(async () => {
  // 先等待服务器完全关闭
  await new Promise((resolve) => server.close(resolve));
  // 再等待Mongoose连接断开
  await mongoose.disconnect();
  console.log("服务器与MongoDB连接已彻底关闭");
});

2. 检查是否存在多个Mongoose连接实例

如果你的测试代码里用过mongoose.createConnection()创建额外连接,只调用mongoose.disconnect()只会关闭默认连接,其他连接还会挂着。这时候得遍历所有连接逐个关闭:

afterAll(async () => {
  await server.close();
  // 关闭所有Mongoose连接实例
  await Promise.all(
    mongoose.connections.map(conn => conn.close())
  );
});

3. 强制清除Mongoose连接池残留

要是上面的方法还不行,可以尝试销毁所有连接池,确保没有残留的socket占用:

afterAll(async () => {
  await server.close();
  await mongoose.disconnect();
  // 强制销毁每个连接的连接池
  mongoose.connections.forEach(conn => {
    conn.destroy();
  });
});

4. 排查事件循环里的活跃资源

脚本停不下来大概率是事件循环里还有未释放的资源,比如定时器、未关闭的第三方服务socket。可以在afterAll末尾打印活跃资源,定位问题:

afterAll(async () => {
  // 先执行关闭逻辑
  await server.close();
  await mongoose.disconnect();
  
  // 打印当前活跃的资源
  console.log("当前活跃资源:", process._getActiveHandles());
});

根据打印结果,针对性地清理——比如清除所有定时器、关闭其他服务的连接等。

5. 验证Mongoose连接的真实状态

你提到Mongo CLI里连接数没变化,可能是MongoDB的连接池复用或延迟更新导致的。可以在代码里直接检查连接状态:

afterAll(async () => {
  await server.close();
  await mongoose.disconnect();
  // 打印每个连接的状态:0=断开,1=连接,2=连接中,3=断开中
  mongoose.connections.forEach(conn => {
    console.log(`连接状态: ${conn.readyState}`);
  });
});

如果所有连接的readyState都是0,说明确实已经关闭了,CLI的连接数显示延迟不用太在意。

兜底方案:强制退出(不推荐,仅应急)

要是以上方法都无效,最后可以在afterAll末尾强制退出进程,但这只是临时解决,最好还是找到根本原因:

afterAll(async () => {
  await server.close();
  await mongoose.disconnect();
  process.exit(0);
});

内容的提问来源于stack exchange,提问作者Khotey Vitaliy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:30:57