Vitest 0.32.0+Node.js+Express测试反复出现ECONNREFUSED错误求助
问题分析与解决方案
可能原因1:localhost解析优先级问题
Vitest热重载后,Axios可能优先将localhost解析为IPv6地址(::1),但你的后端服务仅绑定了IPv4的127.0.0.1,导致连接被拒绝。
解决方法:
将Axios的baseURL从http://localhost:3000改为http://127.0.0.1:3000,强制使用IPv4地址发起请求。
可能原因2:Axios全局实例残留状态
Vitest的watch模式下,热重载不会完全重置全局变量,若使用全局Axios实例,之前的连接池、拦截器等状态可能残留,导致新测试请求异常。
解决方法:
- 避免使用全局Axios实例,在每个测试文件中创建独立实例:
import axios from 'axios'; const api = axios.create({ baseURL: 'http://127.0.0.1:3000' });
- 若必须使用全局实例,在
beforeEach钩子中重置实例配置:
import axios from 'axios'; beforeEach(() => { axios.defaults.baseURL = 'http://127.0.0.1:3000'; // 清除所有拦截器 axios.interceptors.request.clear(); axios.interceptors.response.clear(); });
可能原因3:Vitest watch模式进程残留
极少数情况下,Vitest热重载时旧测试进程未完全退出,导致网络请求被异常拦截。
解决方法:
- 修改Vitest配置,添加
--forceExit参数(仅在watch模式下临时测试):
在package.json的test脚本中修改:
"test": "vitest --watch --forceExit"
- 若问题仍存在,手动杀掉系统中残留的Node进程:
# Windows系统使用 taskkill /F /IM node.exe pkill node
可能原因4:测试钩子未正确清理
如果测试中使用了nock之类的请求mock工具,热重载时mock规则未被清除,会导致请求被转发到不存在的地址。
解决方法:
在afterEach钩子中清除所有mock规则:
import nock from 'nock'; afterEach(() => { nock.cleanAll(); });
内容的提问来源于stack exchange,提问作者David Montero Ureña
相关产品推荐
相关产品推荐

