Fetch请求怎么处理跨域问题?
我在本地用 fetch('http://localhost:3000/api/data') 请求后端接口,但浏览器报CORS错误,说没允许跨域。后端是Node.js写的,已经加了CORS中间件,但前端还是拿不到数据,到底该怎么解决?
我试过在fetch里加 mode: 'no-cors',结果响应变成opaque了,根本读不了内容。这不就白请求了吗?
fetch('http://localhost:3000/api/data', {
method: 'GET',
headers: {
'Content-Type': 'application/json'
}
})
.then(res => res.json())
.then(data => console.log(data))
.catch(err => console.error(err));
首先检查你的Node.js服务器端的CORS中间件设置。常见的错误是只允许了特定的请求方法,但没处理所有需要的header。
用
cors中间件时,建议这么配置:注意
origin: true这个配置,它会动态返回请求源作为可接受的Origin。另外,前端的fetch请求头也有坑。去掉那个
'Content-Type': 'application/json',除非你的API确实需要JSON格式。否则浏览器会把它当成复杂请求,触发预检OPTIONS请求。实在不行就在开发环境试试这个命令:
npm install -g local-cors-proxy,然后运行lcp --proxyUrl http://localhost:3000,这样可以临时绕过CORS限制调试代码。说实话这破CORS真是让人头疼,但为了安全也没办法。记得上线前把CORS配置调好,别用那些临时方案。
注意
origin不能写通配符'*',这会带来安全隐患。要做校验,明确允许哪些来源访问。然后前端fetch请求不用加mode:'no-cors',这是个坑,确实会让响应变成opaque状态。保持原来的写法就行:
最后检查一下服务器端口是不是真的在3000跑着,有时候本地开发容易忘记这个细节。调试这种跨域问题真挺累人的,祝你好运。