> 文章列表 > json-server部署服务器出现net::ERR_CONNECTION_REFUSED的问题

json-server部署服务器出现net::ERR_CONNECTION_REFUSED的问题

json-server部署服务器出现net::ERR_CONNECTION_REFUSED的问题

最近在进行项目部署,也遇到了很多问题,在这里mark一下
我希望我遇到问题,不仅仅是改正Bug,还能知道原理,要知其然,还要知其所以然。

我首先是写了一个react项目,部署在IP1的端口12上,然后写了一个后端node项目,部署在IP1的端口5000上,我想的是react项目取数据,无疑就是用axios取,然后从http://localhost:5000/xxxxxx取数据,然后我发现报错了:
json-server部署服务器出现net::ERR_CONNECTION_REFUSED的问题
在网上找了很久的答案,有人说这是因为取不到后端接口的数据,我打开了后台看了下网络请求,请求报文是完整的,说明请求已经发成功了,只是后台没有应答,所以有没有可能是后台接口根本就没开启呢;

我项目部署在centos系统上,所以我用curl命令去测试了一下接口:
json-server部署服务器出现net::ERR_CONNECTION_REFUSED的问题
好奇怪,我这里是可以取到数据的,那问题究竟出在哪里呢?

网上有人说,这里axios获取数据的地址不能写localhost,应该写服务器公网ip地址,我思考了一下逻辑,好像没毛病,这就涉及到前端八股文中常考的一个问题:输入URL到显示页面的全过程
具体分为以下几步:

  • 浏览器根据请求的 URL 交给 DNS 域名解析,找到真实 IP ,向服务器发起请求;
  • 服务器交给后台处理完成后返回数据,浏览器接收⽂件( HTML、JS、CSS 、图象等);
  • 浏览器对加载到的资源( HTML、JS、CSS 等)进⾏语法解析,建立相应的内部数据结构 (如 HTML 的 DOM);
  • 载⼊解析到的资源⽂件,渲染页面,完成。

所以服务器是会返回js代码交给浏览器去执行,代码是在浏览器本地执行的,不是服务器执行完发给我们。我们本地计算机拿到服务器传来的代码解析时,发现axios获取localhost,会认为是我们本地的ip,会从我们本地电脑拿数据,所以自然会失败,好,既然这样,那我就把axios中的地址改成服务器的公网IP?

答案是 还是取不到数据--------------------😓逻辑应该是没有问题的,这一步应该没有错,至于为什么没有取到数据,看来还得还得继续改。

然后我在服务器端cur测试了以下公网IP去拿接口数据,发现居然失败了,服务器自己拿自己的数据居然还会失败,真是匪夷所思。。。。

于是我在网络上展开了地毯式的搜索…

花了半个晚上加一个上午,终于找到了问题所在,我这个项目中后端用的是json-server搭建的假数据:
一般用json-server搭建的假数据的IP地址是http://localhost:端口号/参数

这个json-server部署在远程linux服务器上,我们本地服务器是访问不到的,只有将json-serverhost改成0.0.0.0,才能让外面访问到,如下所示:

json-server部署服务器出现net::ERR_CONNECTION_REFUSED的问题we
然后发现项目奇迹般可以运行了

怎么改成0.0.0.0就好了呢,这就涉及到计算机网络的知识了

  • 127.0.0.1:等同于localhost,可以认为localhost是域名,127.0.0.1是IP,所有发往目标IP为127.0.0.1的数据包都不会通过网卡发送到网络上,而是在数据离开网络层的时候将其回送给本机的相关进程,所以数据包并不会离开服务器,所以我们在linux服务器上测试接口的时候是可以拿到数据的,因为并没有将数据发往网络,所以我们本地机器去访问服务器IP地址的时候是拿不到;
  • 0.0.0.0:这个表示没有路由的元地址,相当于运行在服务器java程序中的this,当考虑它在一台服务器中的作用的时候,它指代这台机器上的所有IP,假如一台机器上由两个IP:207.16.20.30和203.16.20.5,那么访问这两个IP地址,都可以和这个java程序建立连接。

讲到这里,我就理解我之前出现的各种现象了,首先,我们在服务器搭建了一个json-server程序,该程序部署在服务器的localhost地址上,想要拿到这里的数据,只能在本地服务器拿,因为数据没办法在网络层面传输,哪怕后来我的axios改成服务器公网IP,也要走网卡去解析公网IP,所以拿不到数据;
当我改成0.0.0.0之后,它代表了服务器的公网IP,所以我就能通过公网IP去拿这个数据;