为什么本地React项目调用API会报CORS错误?
我用create-react-app搭了个小项目,想调公司内网的一个测试接口,但一请求就报CORS错误。明明后端同事说已经加了允许跨域的头,可浏览器还是拦着不让发请求。
我在本地开发环境(http://localhost:3000)调用 http://192.168.1.100:8080/api/data,控制台直接报“跨源请求被阻止”。试过在fetch里加mode: ‘no-cors’,结果连请求体都发不出去,而且响应也拿不到。
useEffect(() => {
fetch('http://192.168.1.100:8080/api/data', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({ key: 'value' })
})
.then(res => res.json())
.then(data => console.log(data))
.catch(err => console.error(err));
}, []);
先说后端该怎么配:
你得让后端在响应里返回这几个头:
关键是POST请求会先发一个OPTIONS预检请求,后端必须对OPTIONS请求也返回这些头,不然浏览器直接就把正式请求拦了。你后端同事很可能只加了Allow-Origin,没处理OPTIONS。
如果后端暂时改不了,前端本地开发有个简单办法:
在package.json里加个代理:
然后把fetch的地址改成相对路径:
这样开发服务器会帮你转发请求,同源策略就不生效了。部署到线上再让后端配nginx或者后端自己加CORS头。
至于你试的no-cors:
这模式发的是"不透明"请求,请求能发出去,但浏览器不会把响应内容给你,你拿不到返回数据的。这个模式适合调用那些不需要读取响应的第三方API或者做埋点上报之类的东西,你这种情况用不上。