解决axios的responseType为"json"时IE9报undefined的兼容办法

解决axios的responseType为"json"时IE9报undefined的兼容办法

💡 原文中文,约1000字,阅读约需3分钟。
📝

内容提要

文章讨论 axios 在 IE9 下指定 responseType 为 json 时请求报错的问题:IE9 只返回 responseText 而不返回 data。解决方案是在 main.js 中添加响应拦截器,当 data 为空且 responseType 为 json 时,用 JSON.parse 解析 responseText 并赋给 response.data,从而修复异常。

🔎

延伸解读

问题根源:IE9 的 XHR 限制

文章指出,IE9 的 XMLHttpRequest 对象在请求指定 responseType 为 'json' 时,不会像现代浏览器那样自动将响应文本解析为 JavaScript 对象并放入 response.data,而是仅保留原始的 responseText。这导致 axios 的 then 回调无法正常执行,反而进入 catch 报错。因此,该兼容问题并非 axios 本身缺陷,而是旧版浏览器对 XHR 规范实现不完整所致。

拦截器方案的巧妙之处

解决方案通过在 main.js 中添加 axios 响应拦截器,在响应返回后、业务代码处理前进行干预。拦截器检查三个条件:response.data 为空、请求的 responseType 为 'json'、且 response.request.responseText 存在。满足时手动用 JSON.parse 解析 responseText 并赋值给 response.data。这样业务代码无需修改,保持了调用方式的一致性,体现了拦截器在统一处理兼容性问题上的优势。

使用注意与潜在风险

该方案虽简单有效,但需注意几点:首先,JSON.parse 被包裹在 try-catch 中,解析失败时异常被忽略,可能导致 response.data 仍为空,业务代码需自行处理空数据情况。其次,拦截器仅针对 responseType 为 'json' 的请求生效,其他类型不受影响。最后,该代码依赖 response.request.responseText,若某些环境或 axios 版本中该属性不可用,则条件不成立,需确认实际运行环境。

❓

Q&A

为什么 axios 在 IE9 下设置 responseType 为 json 时会报错?

因为 IE9 下指定 json 格式的请求,response 只返回 responseText,而不像其他浏览器那样返回 data,导致 axios 无法正常处理响应,从而报错。

如何解决 axios 在 IE9 下 responseType 为 json 时报错的问题?

在 main.js 中添加响应拦截器,当 response.data 为空且 responseType 为 'json' 时,用 JSON.parse 解析 response.request.responseText 并赋值给 response.data。

解决 axios IE9 兼容问题的代码应该放在哪里?

应该放在项目的 main.js 文件中,通过 axios.interceptors.response.use 添加响应拦截器。

响应拦截器中判断条件是什么?

条件为:response.data == null 且 response.config.responseType === 'json' 且 response.request.responseText != null。

除了 IE9,还有其他浏览器会出现这个问题吗?

文章指出其他浏览器都可以正常返回 data,只有 IE9 下指定 json 格式的请求才会出现此异常。

这个解决方案的出处是哪里?

解决方案来自 GitHub 上 axios 的 issue 评论,链接为 https://github.com/axios/axios/issues/265#issuecomment-333014355。

🏷️

标签

➡️

继续阅读