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

Mocha测试完成后关闭Mongoose连接出现10000ms超时错误怎么解决?

问题原因定位
  • 钩子使用错误:before 钩子会在所有测试用例执行前运行,在测试启动阶段关闭数据库连接,会直接导致后续测试逻辑无法正常访问数据库,连接关闭逻辑应该放在所有测试执行完毕的 after 钩子中。
  • 异步方法处理错误:mongoose.connection.close() 是返回Promise的异步方法,原代码没有等待异步操作完成就直接调用done(),如果异步操作抛出异常还会导致done()根本没有被触发,最终触发Mocha的超时判定。
解决方案

修正钩子逻辑和异步处理

把原来的before钩子替换成after钩子,推荐用async/await写法简化异步逻辑:

after(async function () {
  // 等待数据库连接关闭完成后再结束钩子
  await mongoose.connection.close();
});

如果要继续使用done回调的写法,需要把done调用放在异步操作的回调中,同时捕获异常:

after(function (done) {
  mongoose.connection.close()
    .then(() => done())
    .catch(err => done(err))
});

排查其他未释放资源

如果修改后进程仍然没有正常退出,需要检查测试代码中是否还有其他存活的资源句柄未释放:

  • 测试中启动的HTTP/HTTPS服务是否调用了close方法关闭
  • setTimeout/setInterval等定时器是否对应执行了clear操作
  • 其他数据库、缓存客户端的连接是否全部正常关闭

临时强制退出方案

如果暂时无法定位未释放的资源,可以在运行Mocha的命令中添加--exit参数,强制Mocha在所有测试用例执行完成后直接终止进程:

mocha ./test/**/*.js --exit

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 14:39:02