我无法获得Axios"得到";在将代码从centos7移动到centos8实例后,请求为前端/后端对工作。有问题的代码在不同的AWS EC2实例上运行得很好。我无法在运行Rocky Linux v8.5的新EC2实例上运行它。
当我捕捉到异常来查看错误时,我看到了一个最无助的:
Error: Network Error
我找不到任何关于投诉或如何解决的信息。我无法获得任何关于问题原因的有用信息。我确信这是一个愚蠢而容易解决的问题——如果我能以某种方式让技术堆栈告诉我问题是什么,那会容易得多
我使用axios
组件访问在React应用程序所在的同一实例上运行的Node Express服务。该服务正在端口7003上侦听https。React应用程序调用此服务器,并返回服务提供的数据。
React应用程序和世界其他地方之间的所有通信都使用axios
,所以我需要解决这个问题。
我使用VisualStudioCode(VSC(来开发我的React和NodeJS代码。
当我使用wget
执行服务时,它似乎起作用:
$ wget "https://my.domain.name.com:7003/getEnvironment"
--2022-02-24 21:46:46-- https://my.domain.name.com:7003/getEnvironment
Resolving my.domain.name.com (my.domain.name.com)... 172.30.2.147
Connecting to my.domain.name.com (my.domain.name.com)|172.30.2.147|:7003... connected.
HTTP request sent, awaiting response... 200 OK
Length: 11205 (11K) [application/json]
Saving to: ‘getEnvironment’
getEnvironment 100%[===================================>] 10.94K --.-KB/s in 0s
2022-02-24 21:46:46 (220 MB/s) - ‘getEnvironment’ saved [11205/11205]
我注意到wget说它正在使用"HTTP";即使我给了它";https";在命令行中。
我使用React/VSC开发服务器在VSC中运行前端。该服务器在端口3003上侦听。
我已经为该服务打开了cors
,它正在按预期侦听端口7003。这就是wget工作的原因。
后端(服务(代码如下所示:
...
var cors = require('cors');
...
var app = express();
...
app.use(cors({origin: true, credentials: true}));
...
失败的前端代码如下所示:
checkStatus(response) {
if (response.status >= 200 && response.status < 300) {
return response.data;
} else {
const error = new Error(`HTTP Error ${response.statusText}`);
error.status = response.statusText;
error.response = response;
console.log(error);
throw error;
}
}
privateLoadEnvironmentUsingURL(url) {
return axios
.get(url)
.then((response) => {return this.checkStatus(response)})
.catch((error) => {
console.log(error);
throw error;
});
}
我已经在VSC的前端和服务中实践了这一点。axios调用失败了,据我所知,这是在调用服务之前进行的。
失败需要一段时间,这让我怀疑暂停正在进行中。我在nodejs服务代码中没有看到任何指示,表明请求实际上正在命中服务。
因此看来;飞行前";协商正在阻止此呼叫。打开cors
几乎是我所知道的全部——我对cors没有深入的了解。
我整个下午都在对着这个代码挥舞巫毒鸡,但都无济于事。
当技术堆栈提供的关于实际发生的事情的信息如此之少时,其他开发人员如何发现如何解决这样的问题?
我该怎么做?
我发现并解决了这个问题,一个完全在axios/nodjs/react之外的网络配置问题。事实仍然是,我认为开发人员应该可以从axios
引发的异常中获得至少一个提示。
对于那些感兴趣的人来说,问题是新系统的AWSSecurity Group
配置。我必须打开Security Group
中的端口7003,允许从我的本地IP地址进行访问,以便将请求转发到平台。
我想我应该早点想到这一点——VSC在我的本地系统上产生了一个特殊的Chrome浏览器,它有自己的私人隧道等等。我的本地计算机上运行的浏览器实例似乎针对端口7003发出了请求。AWS安全组阻止了该端口,因此该请求从未发送到服务器。
我通过从本地机器而不是从新的目标EC2实例执行wget
来识别问题。失败了,然后我尝试连接telnet
。当后者无法连接时,我知道这是安全小组的问题。
最重要的是,有时很容易忘记所有React代码都在浏览器中运行。我知道这是显而易见的。但其含义有时并非如此。