我最近几天一直在设计一个简单的 ReactJS+Typescript 应用程序(与 Webpack 捆绑在一起)。现在,我开始了后端连接部分(不是我的领域,也不是我在这种情况下的责任),我遇到了一些困难。主要问题是浏览器上的 CORS 错误。这是我的设置:
"webpack": "^4.30.0",
"webpack-dev-server": "^3.3.1",
"typescript": "^3.4.5",
"react": "^16.8.6",
"axios": "^0.18.0",
Chrome version 74.0.3729.131 (64-bit)
我已经尝试了几件事来解决这个问题,但没有一个真正解决了这个问题。它们如下:
- 在我的
webpack.dev.ts配置文件中,我配置了 webpack 代理属性。我是这样配置的:
devServer: {
contentBase: path.join(__dirname, process.env.PUBLIC_PATH || '../dist'),
compress: true,
host: process.env.DEV_HOST || 'localhost',
port: process.env.DEV_PORT || 8000,
open: 'chrome',
proxy: {
'/api': {
target: 'http://<ip>:8888',
secure: false,
},
},
headers: {
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Headers': '*',
'Access-Control-Allow-Methods': '*',
},
},
对后端的请求构建如下:
const config = {
method: 'post',
url: '/api/login',
data: { password: password },
};
axios(config)
.then(resp => console.log(resp))
.catch(error => console.log(error));
请注意,目前,该password字段只是一个占位符,并未在后端进行验证,因此,Access-Control-Allow-Credentials不需要标头。
令我非常失望的是,该请求似乎没有使用配置的代理,因为这是错误:

在网络选项卡上,也没有提及后端 IP 地址。请注意,只有在这种情况下,请求才会显示为POST而不是OPTIONS请求。
- 尝试
axios在我这边(客户端)使用 CORS 控制所需的标头进行配置。这也没有带来任何解决方案。这就是我想出的:
const config = {
method: 'post',
url: 'http://<ip>:8888/api/login',
data: { password: password },
headers: {
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Headers': '*',
'Access-Control-Allow-Methods': '*',
},
};
axios(config)
.then(resp => console.log(resp))
.catch(error => console.log(error));
出现的结果类似于没有任何配置的结果(此处附上第一张图片)。
- 最后,我为 CORS 安装了一个 Chrome 扩展,它(我想)将标头附加
Access-Control-Allow-Origin: *到所有请求。这就是事情变得有趣/奇怪的地方。在此扩展处于活动状态(并且未对其进行配置)的情况下,即使我禁用了所有其他先前的选项,错误也会发生变化:
我也尝试过同时激活所有三个先前的选项,最后一个错误就是出现的。
我不确定下一步要去哪里,或者如何从这里开始。我避免请求更改服务器 API 的标头,但作为最后的手段,我保持该选项处于打开状态。
我已尝试对解释和我想要实现的目标进行彻底的解释,但请随时索取更多信息。
提前致谢。

