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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 23:22:13