Failed to fetch. 请用中文详细分析 CORS、网络、证书等所有可能原因,并给出至少四段不同的修复代码示例,回答务必详尽冗长。
错误信息
Uncaught (in promise) TypeError: Failed to fetch. 请用中文详细分析 CORS、网络、证书等所有可能原因,并给出至少四段不同的修复代码示例,回答务必详尽冗长。
AI 解决方案
🔍 错误翻译
原文:Uncaught (in promise) TypeError: Failed to fetch.
译文:在Promise中未捕获的TypeError:获取请求失败
🎯 原因分析
Failed to fetch是浏览器Fetch API抛出的标准错误,本质是网络请求被浏览器强制拦截,核心原因可分为三大类,需结合请求场景逐一排查:
- CORS(跨域资源共享)问题(最常见)
- 例如:前端运行在
http://localhost:3000,请求http://api.example.com,若服务器未允许http://localhost:3000的跨域访问,就会触发报错。 - 注意:简单请求(GET/POST+特定Content-Type)仅依赖响应头校验,复杂请求会先发送预检请求(OPTIONS方法),若服务器未正确处理预检,同样会报此错。
浏览器基于安全策略,对不同源(协议、域名、端口任一不同)的请求会触发CORS校验。若服务器未返回合法的CORS响应头(如
Access-Control-Allow-Origin),或配置的规则不匹配当前请求源,浏览器会直接阻止响应获取,导致该错误。- 网络层面问题
- 网络不通:域名无法解析(DNS解析失败)、服务器宕机、防火墙拦截、代理配置错误,导致请求根本无法触达服务器;
- 请求中断:服务器响应超时(超时时间过短或服务器处理耗时过长)、客户端主动取消请求(如调用
AbortController的abort方法),浏览器会中断请求并抛出该错误; - 跨协议限制:当前页面是
https协议,请求http协议的接口,现代浏览器会默认拦截混合协议请求,引发请求失败。
这类问题与请求链路的可达性直接相关,是请求发出后未得到预期响应就被中断:
- SSL/TLS证书问题
- 证书无效:证书已过期、未生效,或证书链不完整(浏览器无法验证证书的根机构,如自签名证书未被客户端信任);
- 域名不匹配:证书绑定的域名与请求的域名不一致(如证书绑定
api.example.com,但请求了test.api.example.com); - 安全策略强制:浏览器检测到证书存在安全漏洞,或强制要求必须使用安全协议,会拒绝建立连接。
当请求的是
https接口时,浏览器会严格校验服务器证书的合法性,证书问题会直接导致请求失败,核心原因包括:💡 解决方案
针对上述三类核心原因,以下提供四段不同场景的修复代码示例,覆盖后端、前端、特殊场景,可直接复用或调整:
1. 后端配置CORS响应头(解决跨域问题,通用方案)
若问题核心是CORS校验失败,最稳妥的