如何解决前端Axios请求报Net::ERR_CONNECTION_REFUSED连接拒绝问题
Net::ERR_CONNECTION_REFUSED是前端使用Axios发起HTTP请求时,最常见的网络层错误之一,该错误的出现与Axios语法、接口请求参数无关,也并非前端代码逻辑问题,核心是前端客户端无法与目标服务端建立基础的TCP连接,服务端对客户端发起的连接请求做出了拒绝响应。这类问题的排查需跳出前端代码本身,从「服务端运行状态」「前端请求配置」「网络链路通畅性」「端口/防火墙限制」四个核心维度逐步验证,本地开发环境还需额外检查代理转发配置,以下是从易到难的完整排查流程和针对性解决方案,覆盖本地、局域网、线上生产所有开发场景。
文章目录
一、核心认知:错误本质与核心诱因
在解决问题前,先明确该错误的底层逻辑,能避免盲目排查——该错误属于TCP/IP网络层异常,而非HTTP应用层异常,出现时客户端的请求甚至未能到达服务端的接口处理逻辑,仅在「建立TCP连接」阶段就被阻断。
1.1 错误的核心本质
TCP协议建立连接时需经过「三次握手」,Net::ERR_CONNECTION_REFUSED表示:前端客户端向服务端的指定IP+端口发送了TCP连接请求,但服务端未对该请求做出任何响应,直接拒绝了连接,导致三次握手无法完成,请求链路直接中断。
1.2 触发错误的四大核心诱因
所有场景下的连接拒绝,最终都能归为以下四类原因,按出现频率从高到低排序:
- 服务端未启动/启动失败:目标服务端的后端项目未运行,或启动时因代码错误、端口占用等原因崩溃,无进程监听指定端口;
- 前端请求配置错误:Axios的请求地址(URL)、端口号、协议(http/https)与服务端实际配置不匹配,请求了错误的目标地址;
- 网络链路不通:前端与服务端不在同一网络(如局域网开发时跨网段)、防火墙/安全软件拦截了连接请求、云服务器安全组未放行端口;
- 开发环境代理配置错误:Vue/React等项目通过devServer配置了接口代理,代理的目标地址(target)写错,导致请求被转发到无效地址,触发连接拒绝。
1.3 关键区分:避免与其他错误混淆
开发中易将该错误与跨域、接口404/500混淆,需通过错误提示精准区分,避免排查方向偏离:
- Net::ERR_CONNECTION_REFUSED:TCP连接建立失败,请求未到服务端;
- CORS跨域错误:TCP连接成功,请求已到服务端,仅HTTP层面因跨域策略被拦截;
- 404 Not Found:TCP连接+HTTP请求均成功,服务端未找到对应接口;
- 500 Internal Server Error:TCP连接+HTTP请求均成功,服务端处理接口时内部报错。
二、从易到难:分步排查与针对性解决方案
排查遵循**「先确认服务端→再检查前端本地配置→最后验证网络链路」**的原则,从最容易验证、出现频率最高的原因开始,逐步缩小排查范围,所有步骤均提供具体的验证方法和解决操作,新手也能直接跟进。
步骤1:验证目标服务端是否正常运行,有无进程监听指定端口
这是触发Net::ERR_CONNECTION_REFUSED最核心、最常见的原因,优先验证该点,能解决80%以上的问题。核心验证逻辑:确认服务端有进程正常监听Axios请求的「IP+端口」。
具体验证方法
- 检查服务端启动日志:打开后端项目的启动终端/日志文件,查看是否有「启动成功」「监听端口xxx」的提示,若有代码错误、端口占用等提示,说明服务端启动失败;
- 手动访问服务端地址:在浏览器地址栏直接输入服务端的基础地址(如
http://localhost:3000、http://192.168.1.100:8080),若浏览器显示「无法访问此网站」且控制台报相同的连接拒绝错误,说明服务端未启动/无进程监听端口; - 检查端口是否被占用/有无监听进程:通过命令行查看指定端口是否有进程在监听,不同系统命令不同:
Mac/Linux系统:打开终端,执行命令(替换为实际端口号):
# 查看指定端口的监听进程lsof -i:8080 # 或简化版命令netstat -tulpn |grep8080若执行后无输出,说明端口无进程监听。
Windows系统:打开CMD/PowerShell,执行命令(替换为实际端口号):
# 查看指定端口的占用情况,找到PID(进程号)netstat -ano | findstr "8080"若执行后无任何输出,说明该端口无进程监听;若有输出,可通过PID查看对应进程是否为目标后端服务。
针对性解决方案
- 重新启动后端服务:若服务端未启动,直接运行后端项目的启动命令(如Java的
java -jar xxx.jar、Node.js的node app.js、SpringBoot的IDE启动); - 解决服务端启动失败问题:若启动日志有报错,按错误提示修复(如代码语法错误、依赖缺失);若提示端口被占用,要么杀死占用端口的进程,要么修改后端服务的监听端口;
- 杀死占用端口进程:Windows通过「任务管理器」根据PID结束进程,Mac/Linux执行
kill -9 进程PID; - 修改后端端口:如SpringBoot修改
application.yml的server.port,Node.js修改app.listen(新端口);
- 杀死占用端口进程:Windows通过「任务管理器」根据PID结束进程,Mac/Linux执行
- 确认服务端监听的是正确端口:确保后端服务监听的端口,与前端Axios请求的端口完全一致。
步骤2:检查前端Axios请求配置,确保地址/端口/协议完全正确
服务端启动正常后,若仍报连接拒绝,需检查前端请求配置——请求地址拼写错误、端口号写错、http/https混用是前端开发中高频的低级错误。
具体验证方法
- 查看Axios的实际请求地址:打开浏览器F12→Network面板,找到报红的请求,查看Request URL列,确认实际请求的地址是否为服务端的真实地址;
- 核对Axios的基础配置:检查项目中Axios的
baseURL配置(全局配置)或单个请求的url(局部配置),重点核对3点:- 协议:服务端用
http则前端不能写https(如服务端是http://localhost:3000,前端写https://localhost:3000会直接拒绝); - 域名/IP:本地开发常用
localhost/127.0.0.1,局域网开发需用服务端的本机IP(如192.168.1.105),不能用localhost; - 端口号:与服务端监听的端口完全一致,无多写/少写数字(如服务端3000,前端写3001);
- 协议:服务端用
- 检查是否有硬编码的错误地址:部分开发会在单个请求中硬编码url,覆盖了全局
baseURL,需排查是否有此类情况。
针对性解决方案
- http/https严格与服务端保持一致:若服务端未配置HTTPS证书,前端绝对不能用
https协议发起请求,直接改为http。
单个请求仅写接口路径,不写完整地址:基于全局baseURL,单个请求只需写接口后缀,避免协议/端口错误:
// 正确:仅写接口路径,自动拼接baseURL service.get('/api/user/list')// 错误:硬编码完整地址,易出现拼写/端口错误// axios.get('http://localhost:3001/api/user/list')统一Axios的全局baseURL配置:推荐在项目中全局配置Axios的baseURL,避免单个请求硬编码,减少错误率,示例:
// 正确配置Axios全局baseURL,根据环境区分import axios from'axios'const service = axios.create({// 本地开发:服务端本地地址// baseURL: 'http://localhost:3000',// 局域网开发:服务端本机IPbaseURL:'http://192.168.1.105:3000',timeout:5000})exportdefault service 步骤3:验证前端与服务端的网络链路是否通畅,无防火墙/安全软件拦截
服务端启动正常、前端配置正确后,仍报连接拒绝,需排查网络链路——前端和服务端不在同一网络、防火墙拦截连接是局域网/线上开发的常见原因。
具体验证场景与方法
按「本地开发→局域网开发→线上开发」分场景验证,核心逻辑:确保前端能通过网络访问到服务端的IP+端口。
- 本地开发场景(前端+服务端在同一台电脑)
- 验证:用
localhost/127.0.0.1访问服务端地址,若localhost能访问、127.0.0.1不能,大概率是本地hosts文件配置错误; - 额外检查:关闭本地的杀毒软件、防火墙(如Windows Defender、360安全卫士),部分安全软件会拦截本地端口的连接请求。
- 验证:用
- 局域网开发场景(前端+服务端在不同电脑,同一局域网)
- 验证1:前端电脑通过「ping 服务端IP」测试网络连通性,如
ping 192.168.1.105,若出现「请求超时」,说明两台电脑不在同一网段/局域网不通; - 验证2:前端电脑在浏览器直接访问服务端的「IP+端口」,如
http://192.168.1.105:3000,若报连接拒绝,说明服务端电脑的防火墙拦截了请求; - 关键注意:局域网开发时,前端Axios的
baseURL必须写服务端的本机IP,不能写localhost(localhost仅指向当前电脑)。
- 验证1:前端电脑通过「ping 服务端IP」测试网络连通性,如
- 线上生产场景(前端部署在服务器/CDN,服务端部署在云服务器)
- 验证1:本地电脑通过浏览器访问线上服务端的「域名/公网IP+端口」,如
https://api.xxx.com:8080,若报连接拒绝,说明云服务器的端口未开放; - 验证2:检查云服务器的安全组规则(阿里云/腾讯云/华为云均有),这是线上场景最容易忽略的点——云服务器的端口需在安全组中手动放行,否则即使服务端启动、服务器防火墙关闭,外部也无法访问;
- 验证3:检查服务端服务器的系统防火墙(如Linux的iptables/firewalld,Windows的防火墙),确保放行目标端口。
- 验证1:本地电脑通过浏览器访问线上服务端的「域名/公网IP+端口」,如
针对性解决方案
- 本地开发:修复hosts文件(C:\Windows\System32\drivers\etc\hosts),确保
127.0.0.1 localhost未被注释;临时关闭杀毒软件/防火墙,测试是否能连接。 - 局域网开发:
- 将前端和服务端电脑连接到同一WiFi/交换机,确保在同一网段(IP前三位相同,如192.168.1.x);
- 关闭服务端电脑的系统防火墙:Windows在「设置→更新和安全→Windows安全→防火墙和网络保护」中关闭;Linux执行
systemctl stop firewalld(临时关闭);
- 线上生产场景:
- 云服务器安全组放行端口:在云服务器控制台的「安全组」中,添加入站规则,放行服务端的监听端口(如8080、3000),允许所有IP访问(0.0.0.0/0);
- 服务器系统防火墙放行端口:Linux通过iptables/firewalld添加端口放行规则,Windows在防火墙高级设置中添加入站规则;
- 确认服务端绑定的是公网IP:后端服务启动时,确保监听的是
0.0.0.0(所有IP),而非127.0.0.1(仅本地访问),如Node.js的app.listen(3000, '0.0.0.0')。
步骤4:检查开发环境的代理配置,确保代理转发地址正确
Vue/React/Vite等前端项目,为了解决本地开发的跨域问题,会通过devServer.proxy(webpack)/server.proxy(Vite)配置接口代理——代理的target地址写错是开发中极易忽略的点,此时前端请求的是本地代理地址,代理服务器转发到错误的服务端地址,最终触发连接拒绝。
具体验证方法
- 确认项目是否配置了代理:查看项目配置文件(Vite为
vite.config.js,Vue2为vue.config.js,React为src/setupProxy.js),是否有proxy相关配置; - 检查代理的target地址:核心核对代理的
target是否为服务端的真实地址(协议+IP+端口),是否存在端口、协议写错的情况; - 验证代理是否生效:打开浏览器Network面板,查看Axios的请求地址是否为本地项目地址(如
http://localhost:8080/api/user),而非服务端地址,若为本地地址,说明代理已生效,需重点检查target。
针对性解决方案
核心原则:代理的target必须是服务端的真实可访问地址,且配置后需重启前端项目(代理配置修改后不重启不生效),以下给出主流框架的代理正确配置示例。
示例1:Vue3/Vite项目(vite.config.js)
import{ defineConfig }from'vite'import vue from'@vitejs/plugin-vue'exportdefaultdefineConfig({plugins:[vue()],server:{port:8080,// 前端项目端口proxy:{// 匹配所有以/api开头的请求,转发到target'/api':{target:'http://192.168.1.105:3000',// 服务端真实地址(必须正确)changeOrigin:true,// 开启跨域代理(必配)rewrite:(path)=> path.replace(/^\/api/,'')// 可选:重写路径,根据服务端接口调整}}}})示例2:Vue2/@vue/cli项目(vue.config.js)
module.exports ={devServer:{port:8080,proxy:{'/api':{target:'http://localhost:3000',// 服务端本地地址changeOrigin:true,pathRewrite:{'^/api':''}}}}}示例3:React/create-react-app项目(src/setupProxy.js)
需先安装http-proxy-middleware:npm install http-proxy-middleware --save-dev
const{ createProxyMiddleware }=require('http-proxy-middleware') module.exports=function(app){ app.use('/api',createProxyMiddleware({target:'http://192.168.1.105:3000',changeOrigin:true,pathRewrite:{'^/api':''}}))}关键代理配置注意点
changeOrigin: true是必配项,开启后代理服务器会模拟服务端的域名,避免跨域;- 代理配置修改后,必须重启前端项目,否则配置不生效;
- 前端Axios的
baseURL需配置为前端项目的本地地址(如http://localhost:8080),才能触发代理转发。
步骤5:终极验证:通过curl/postman测试,排除前端项目环境问题
若以上步骤均验证无误,仍报连接拒绝,需排除前端项目本身的环境问题(如依赖冲突、配置污染),通过curl命令或Postman直接发起请求,测试服务端地址是否可访问。
具体验证方法
- Postman测试:打开Postman,输入服务端的接口地址,发起请求,若能正常响应,说明服务端和网络均无问题,问题出在前端项目。
curl命令测试:打开前端电脑的终端/CMD,执行curl命令(替换为服务端真实地址):
# 测试GET请求curl http://192.168.1.105:3000/api/user/list # 测试POST请求curl -X POST -d "name=test" http://192.168.1.105:3000/api/user/add 若curl命令也报「Connection refused」,说明问题与前端项目无关,回到步骤3重新排查网络/防火墙;若curl命令能正常获取接口返回值,说明前端项目环境有问题。
针对性解决方案
若curl/Postman能正常访问,仅前端项目报连接拒绝,按以下步骤处理:
- 重启前端项目,清除项目缓存(如Vite的
node_modules/.vite,webpack的node_modules/.cache); - 重新安装Axios依赖:
npm uninstall axios && npm install axios,排除依赖损坏问题; - 检查项目中是否有其他网络相关配置(如mock服务、请求拦截器),是否拦截/修改了Axios的请求地址;
简化请求代码,用原生fetch测试,排除Axios本身的问题:
// 用原生fetch测试,若能正常请求,说明Axios配置有问题fetch('http://192.168.1.105:3000/api/user/list').then(res=> res.json()).then(data=> console.log(data)).catch(err=> console.log(err))三、不同开发场景的专属排查重点
不同的开发场景(本地/局域网/线上),触发连接拒绝的核心原因不同,针对性聚焦排查重点,能大幅提升排查效率,以下是各场景的核心排查点总结:
场景1:本地开发(前端+服务端在同一台电脑)
核心排查点:
- 服务端是否正常启动,有无进程监听指定端口;
- 前端Axios的地址是否为
localhost/127.0.0.1,端口与服务端一致; - 本地杀毒软件/防火墙是否拦截了端口连接;
- 代理配置的target是否为
localhost/127.0.0.1+正确端口。
场景2:局域网开发(前端+服务端在不同电脑)
核心排查点:
- 前端和服务端是否连接到同一WiFi/交换机,是否在同一网段;
- 前端Axios/代理的地址是否为服务端的本机IP(不能用localhost);
- 服务端电脑的系统防火墙是否关闭,是否放行目标端口;
- 服务端是否监听
0.0.0.0(而非127.0.0.1),允许局域网访问。
场景3:线上生产场景(前端/服务端部署在服务器)
核心排查点:
- 云服务器的安全组规则是否放行服务端的监听端口(入站规则);
- 服务器的系统防火墙(iptables/firewalld)是否放行目标端口;
- 服务端是否监听
0.0.0.0,允许公网访问; - 前端Axios的地址是否为服务端的公网IP/域名,协议(http/https)与服务端一致;
- 服务端部署后是否正常启动,有无进程监听指定端口(通过
lsof -i:端口验证)。
四、高频避坑点:这些细节会导致排查反复
即使掌握了排查步骤,若忽略以下细节,仍会出现「排查后仍报错误」的情况,这些是开发中极易踩坑的点,需重点注意:
避坑1:代理配置修改后未重启前端项目
代理配置(vite.config.js/vue.config.js)属于项目启动时的静态配置,修改后若不重启前端项目,配置不会生效,前端仍会按旧的target地址转发请求,导致连接拒绝。
解决方案:修改代理配置后,必须执行npm run dev/serve重启项目。
避坑2:服务端绑定127.0.0.1,拒绝局域网/公网访问
后端服务启动时,若监听的是127.0.0.1,则仅允许服务端本机访问,局域网/公网的前端请求会被直接拒绝;正确的做法是监听0.0.0.0,允许所有IP访问。
示例:Node.js服务端正确监听配置
// 错误:仅本地访问,局域网/公网无法连接// app.listen(3000, '127.0.0.1', () => console.log('服务启动'))// 正确:允许所有IP访问,局域网/公网均可连接 app.listen(3000,'0.0.0.0',()=> console.log('服务启动'))避坑3:线上云服务器只关闭系统防火墙,未配置安全组
云服务器(阿里云/腾讯云)有安全组和系统防火墙两层防护,即使关闭了系统防火墙,若安全组未放行端口,外部请求仍会被拒绝;安全组是云服务器的第一道防护,必须优先配置。
解决方案:在云服务器控制台,找到对应实例的安全组,添加入站规则,放行服务端端口,来源选择「0.0.0.0/0」(允许所有IP)。
避坑4:http和https混用,服务端无HTTPS证书仍用https请求
若服务端未配置SSL证书,未开启HTTPS服务,前端强行用https协议发起请求,会直接触发TCP连接拒绝;协议必须严格匹配,无证书则用http,有证书则用https。
避坑5:局域网开发时,前端Axios写localhost而非服务端IP
localhost和127.0.0.1均指向当前电脑,局域网开发时,前端电脑的localhost指向前端本身,而非服务端电脑,请求localhost会导致连接到前端电脑的无效端口,触发拒绝。
解决方案:局域网开发时,前端所有请求地址必须写服务端的本机IP(如192.168.1.105)。
五、总结:Net::ERR_CONNECTION_REFUSED通用排查流程
Axios请求报Net::ERR_CONNECTION_REFUSED的排查,核心是跳出前端代码,聚焦「TCP连接建立」的全链路,该错误与Axios、前端逻辑无关,只需按「从易到难、分场景聚焦」的原则逐步验证,以下是可直接套用的通用排查流程,覆盖所有场景:
通用排查步骤(按执行顺序)
- 验证服务端:检查服务端是否正常启动,有无进程监听目标端口,启动日志是否无报错;
- 验证前端配置:检查Axios的baseURL/请求url,确保协议、IP/域名、端口与服务端完全一致;
- 验证网络链路:本地/局域网/线上按对应场景,检查网络是否连通、防火墙/安全组是否放行端口;
- 验证代理配置:开发环境检查proxy的target地址是否正确,修改后是否重启前端项目;
- 终极验证:用curl/Postman测试服务端地址,排除前端项目环境问题;
- 细节检查:确认服务端监听0.0.0.0、无http/https混用、无端口占用。
核心解决思路(3句话概括)
- 先定服务端:服务端未启动/无端口监听是核心原因,优先验证并确保服务端正常运行;
- 再核配置:前端请求地址、代理target的协议/IP/端口,必须与服务端完全一致,无任何拼写错误;
- 最后查网络:网络链路的防火墙/安全组/网段问题,是本地外场景的主要诱因,需按场景针对性放行端口、确保网络连通。
遵循以上流程和解决方案,能快速定位并解决99%以上的Net::ERR_CONNECTION_REFUSED问题,同时养成「先验证服务端,再检查前端,最后排查网络」的排查思维,后续遇到同类网络连接问题,也能高效解决。
【专栏地址】
更多 Vue实战BUG调试、网络请求、Axios优化、前端工程化解决方案,欢迎订阅我的 ZEEKLOG 专栏:🔥全栈BUG解决方案