Mock icon indicating copy to clipboard operation
Mock copied to clipboard

引入mock后,axios响应头的responseType失效,导致乱码了

Open boluo-muma opened this issue 4 years ago • 6 comments

引入mock后,axios响应头的responseType:blob‘’失效,导致乱码了。。。。这个是否解决呢

boluo-muma avatar Nov 19 '20 02:11 boluo-muma

可以解决的,有两个方式,在拦截处判断响应头再进行 return。或者使用 https://github.com/wll8/mockm

wll8 avatar Feb 26 '21 05:02 wll8

如果未匹配到数据模板,Mockjs会初始化原生XHR对象,这个过程导致设置axios里设置的responseType没有起作用。 所以,如果在使用类似axios({ responseType: "arraybuffer" })的时候,这个设置并没有起作用的原因。

  1. 在axios的xhr开始open时(axios::xhr.js),mockjs对其xhr对象进行了初始化,并将原生xhr的设置复制给了mockjs xhr对象,这个过程没有设计到responseType的设置(mockjs::mock.js)
  2. axios的xhr对象在执行send之前,对responseType进行了设置(这个过程没有对mockjs的xhr对象设置同样的responseType)
  3. 在执行send时,mockjs开始判断,如果没有匹配到数据模板,则启用原生的xhr对象执行,这个时候mockjs将它的xhr设置复制给原生的xhr对象。

这个过程中第2步的执行是没有将responseType值继承的。

https://github.com/nuysoft/Mock/pull/426 这个issue应该也不能解决这个问题,可能axios的config.responseType能在open前复值给request对象就可以了。

oh-bala avatar Jul 26 '21 09:07 oh-bala

如果未匹配到数据模板,Mockjs会初始化原生XHR对象,这个过程导致设置axios里设置的responseType没有起作用。 所以,如果在使用类似axios({ responseType: "arraybuffer" })的时候,这个设置并没有起作用的原因。

  1. 在axios的xhr开始open时(axios::xhr.js),mockjs对其xhr对象进行了初始化,并将原生xhr的设置复制给了mockjs xhr对象,这个过程没有设计到responseType的设置(mockjs::mock.js)
  2. axios的xhr对象在执行send之前,对responseType进行了设置(这个过程没有对mockjs的xhr对象设置同样的responseType)
  3. 在执行send时,mockjs开始判断,如果没有匹配到数据模板,则启用原生的xhr对象执行,这个时候mockjs将它的xhr设置复制给原生的xhr对象。

这个过程中第2步的执行是没有将responseType值继承的。

#426 这个issue应该也不能解决这个问题,可能axios的config.responseType能在open前复值给request对象就可以了。

能不能给个具体的解决方法?

tianxiaozi avatar Jan 20 '22 03:01 tianxiaozi

可以不使用xhr,改为fetch获取文件blob。 (^o^)/~

tanhh326 avatar Sep 16 '22 08:09 tanhh326

这个仓库已经不维护了,我fork了一份已经解决,可以使用我fork的仓库 tony-mockjs

npm i tony-mockjs

我的代码里里面使用了threejs,具体的responseType值会是 text|ArrayBuffer|json,目前工作良好

具体核心代码如下

image

ygweric avatar Sep 12 '23 08:09 ygweric