response.type === "opaque" 明确表示该响应来自 mode: "no-cors" 请求,内容不可读:status恒为0、headers为空、text()/json()会抛错;仅适用于无需响应的单向上报场景。

直接检查 response.type 的值即可判断是否为 opaque 响应。它是一个只读字符串属性,取值只能是 "basic"、"cors" 或 "opaque",其中 "opaque" 明确表示该响应来自跨域 no-cors 请求,内容不可读。
什么时候 response.type 会是 "opaque"
仅当 fetch 请求显式设置了 mode: "no-cors" 时,返回的 Response 对象的 type 才为 "opaque"。此时:
- 浏览器仍会发出请求,但不发送
Origin头,服务端通常无法识别为跨域请求 - 响应状态始终为
0,statusText为空字符串 -
response.headers为空 Headers 对象(所有get()调用返回null) -
response.body不可读取,调用response.text()、response.json()等方法会立即抛出 TypeError -
response.redirected和response.url仍可用,但url是原始请求地址,非重定向后的真实地址
如何在代码中安全检测
不要仅靠 response.type === "opaque" 就做业务逻辑分支,而应结合请求配置和使用意图来判断:
- 若你本意是获取数据,却得到
"opaque",说明请求模式配置错误——应改用mode: "cors"并确保服务端返回合法 CORS 头 - 若你只需触发服务端行为(如埋点、打点、缓存预热),且不依赖响应内容,
"opaque"是预期结果,此时可忽略 body 解析 - 检查前先确认是否主动设置了
mode: "no-cors";未设置 mode 时默认为"cors",type不可能为"opaque"
常见误判场景
以下情况 不会 导致 response.type === "opaque":
- CORS 头缺失导致请求失败(报
TypeError: Failed to fetch)——此时 Promise 已 reject,根本拿不到 response 对象 - 服务端返回 404 或 500:只要不是
no-cors模式,type仍是"cors"或"basic",只是response.ok为 false - 使用
mode: "same-origin"但 URL 跨域:fetch 直接 reject,无 response 可查
不复杂但容易忽略:response.type 是浏览器对请求策略的“事后声明”,它反映的是你 怎么发的,而不是服务器 怎么回的。











