Vitest调用本地Quarkus接口遇ECONNREFUSED错误,浏览器及应用可正常访问
问题排查与解决方法
1. IPv6/IPv4 地址绑定差异
错误信息显示连接的是::1(IPv6的localhost),但你的Quarkus服务器可能仅绑定了IPv4的127.0.0.1。浏览器通常会在IPv6连接失败时自动 fallback 到IPv4,但Node.js环境下的fetch可能优先使用IPv6地址,导致连接被拒绝。
解决方法:将测试代码里的URL从http://localhost:9000/api/test改为http://127.0.0.1:9000/api/test,强制使用IPv4连接。
2. 网络环境隔离问题
如果Quarkus服务器运行在Docker容器或虚拟机中,Vitest所在的本地Node进程的localhost指向自身进程的网络空间,而非服务器所在的容器/虚拟机网络,自然会连接失败。
解决方法:
- 用宿主机的局域网IP(如
192.168.x.x)替换localhost; - 若使用Docker容器,确保端口映射正确,Windows/macOS环境可使用
host.docker.internal,Linux环境直接用宿主机IP访问容器内服务。
3. 测试进程与服务器启动时序验证(低概率)
虽然你设置了beforeAll超时,但极端情况下测试代码发起请求时,Quarkus可能还未完成初始化(如数据库连接、依赖加载),导致临时拒绝连接。
解决方法:在beforeAll中添加重试逻辑,循环请求直到成功或超时:
beforeAll(async () => { const maxRetries = 10; let retries = 0; let success = false; while (!success && retries < maxRetries) { try { response = await fetch('http://127.0.0.1:9000/api/test'); body = await response.json(); success = true; } catch (err) { retries++; await new Promise(resolve => setTimeout(resolve, 2000)); // 间隔2秒重试 } } if (!success) throw new Error('重试多次后仍无法连接服务器'); }, BEFORE_ALL_TIMEOUT);
4. Vitest 配置网络限制排查(低概率)
虽然外部API调用正常,但可检查Vitest配置是否存在影响本地请求的规则。
解决方法:查看vite.config.ts或vitest.config.ts,确保无拦截本地请求的配置:
import { defineConfig } from 'vitest/config'; export default defineConfig({ test: { isolate: false, // 尝试关闭隔离模式 }, });
内容的提问来源于stack exchange,提问作者Murrah
相关产品推荐
相关产品推荐

