[axios]修复 IE11/Edge 不尊重responseType,所以手动修复

2024-02-21 112 views
4
失败案例
axios({
  url: 'example.com',
  responseType: 'json',
  transformResponse: [
    data => {
      console.log(data.message.field);  // ERROR
    }
  ]
})

在 IE 11 中运行上述案例时,将在标记的行处抛出错误。

因为:

  1. defaults.transformResponse被覆盖
  2. IE 11 忽略XHR.responseTypeXHR.response始终给出string
这个公关做得怎么样

每当我们发现responseType被设置为json且响应类型为 时string,请尝试JSON.parse它。

回答

6

似乎Edge 也不会自动解析 JSON ——你能验证这个 PR 也修复了这个问题吗?

我唯一觉得奇怪的是字符串是有效的 JSON 值。因此,如果您返回的 JSON 值只是一个字符串,则可能会尝试对其进行双重解析并导致问题。

> JSON.parse('"foo"')
< "foo"
> JSON.parse(JSON.parse('"foo"'))
< SyntaxError: JSON Parse error: Unexpected identifier "foo"
6

谢谢提醒。我没有注意到Edge也有同样的问题。当我有时间的时候我会尝试一下。

至于你JSON.parse("string")担心的问题,应该没问题,因为它的JSON.parse包裹方式try ... catch就像原来的一样transformResponse

5

是的,仔细想一想,这似乎非常非常容易造成任何不良影响。

具体来说,您需要一个可解码为 JSON 字符串的响应正文,该响应正文本身也可解码为 JSON:

> var weird = '"{\\"name\\": \\"strange\\"}"';
> JSON.parse(JSON.parse(weird))
< {name: "strange"}

任何遇到这种情况的人都可以设置responseType: text并完全控制它。

3

我在 IE11 上也遇到同样的问题。此更改似乎可以解决此问题。我们可以合并它吗?

5

soooo,我们要合并这个吗?

3

如果不重写的话,还会有问题吗?所以我认为关键点是正确设置transformResponse。如果我错过了什么,请提醒我。