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
相关产品推荐
相关产品推荐

