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

Jest测试运行完成1秒后未退出,Express+Mongoose项目测试通过却资源未释放

问题根源定位及修复方案

1. 最常见诱因:Express实例重复启动监听

你在测试中直接引入了app.js导出的Express实例,如果app.js末尾存在直接调用app.listen(端口号)的逻辑,supertest引入实例时会自动启动端口监听服务,该服务在测试完成后不会主动关闭,就会残留句柄导致Jest无法退出。

修复方案:

拆分服务启动逻辑:

  • 把app.js中的app.listen代码移动到单独的入口文件(如index.js)
  • app.js仅保留Express实例的逻辑定义和导出,不自行启动监听

2. Mongoose连接释放不彻底

你当前只调用了mongoose.connection.close(),针对Mongoose 6.x+版本以及MongoDB TLS连接场景,需要完全销毁连接实例才能释放底层TCP套接字,对应你收到的TLSWRAP类型报错。

修复方案:

修改afterAll钩子逻辑:

afterAll( async () => {
  await mongoose.connection.close()
  await mongoose.disconnect()
} )

如果使用的是MongoDB Atlas等远程TLS连接,可以在mongoose.connect的配置中添加family: 4参数强制使用IPv4连接,避免IPv6握手残留导致的句柄未释放问题:

await mongoose.connect(MONGODB_URI, {
  family: 4
})

3. 兜底修复方案

如果以上操作都完成后仍然存在退出延迟,可以在afterAll钩子末尾主动退出进程(仅测试场景使用,不影响生产代码):

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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 06:06:05