解决 axios onUploadProgress方法在断网情况下也能被调的问题(跨域反向代理)

问题解决

开发中我们可能会遇到展示文件上传进度的需求,原生的 XHR 请求是支持进度回调,axios 有 onUploadProgress 事件,而 fetch 不支持进度。所以要留意一下你的公司内部请求库是基于哪个封装的,才能顺利使用进度回调。

axios({ // 用法
  url: 'http://...',
  method: 'POST',
  data: data,
  onUploadProgress: handlerProgress
})

然而在实际项目中,我遇到了这种情况,正常使用 axios 的 onUploadProgress 事件没问题,但是断开网络后,onUploadProgress 还是会有 loaded 进度产生。于是上网搜索,axios 官方 issue 上也有人提过这个问题,但是没有给出回答。而且,令我纳闷的还有,在拔掉网线的情况下,我点击上传,network 下面的请求不是直接标红报网络错误,而是 pendding 了好久才报错。正常断网不是应该发布出去请求么,而且 onUploadProgress 居然还返回了已上传了多少多少字节数据?
在我找到问题之前,我一度以为这是 axios 存在的 bug,后来才意识到可能是代理引起的。我的项目使用的是 umi 搭建,为了开发环境下实现跨域,我没有选择设置浏览器安全策略,而是选择了 umi 提供的 proxy 代理。于是我的请求都是先请求了本地 localhost ,再由代理转发到远程后端服务,这样一来就实现了跨域请求。
其实问题也不难被发现,打开控制台 network 查看,请求的 url 其实是本地的:


image.png

那就好理解了,前端发送上传请求到本地,本地接收文件流的同时向服务器发送请求和文件流,在断网的情况下,前端请求可以发送到本地,但是本地的发送不了给服务端,会报错,导致请求失败。onUploadProgress 仅有的一点已加载的数据其实是发送给本地服务的数据。这也就能解释为什么 onUploadProgress 在断网的情况下还能回传进度了。

关于跨域和反向代理

由于浏览器有同源策略,客户端访问和自己非同源的服务器(协议、ip、端口),如果不做任何设置,是会被拒绝的。解决跨域的方式很多:jsonp、iframe、浏览器设置、服务端设置响应头(CORS)、反向代理等等。这里说一下我对反向代理的理解。


反向代理.png

关于正向代理和反向代理的区别:

  • 正向代理:客户端知道真正的服务器地址,而服务器不知道真正的客户端是谁,只知道代理服务器地址;
  • 反向代理:客户端只管访问代理服务器,而真实请求被代理到哪里是未知的;
    实际上正向代理隐藏了真实的客户端,而反向代理隐藏了真实的服务端。反向代理可以用来处理服务器的负载均衡以及解决跨域问题。

反向代理如何解决跨域问题:
在使用 Nginx 部署项目的时候,我们开启某个端口对外提供服务,但是用户在访问网站的时候,一般不会记得网站具体的端口,于是通常情况下我们都是将网站部署在默认端口80下。但是后台服务的地址肯定不会是 80,那这样虽然前后端是在同一个ip下也会存在跨域。
Nginx 允许我们配置一个代理,将80端口下的特定路由的请求代理到对应的真实服务器上,也就是说客户端发送 /api/getInfo 这个请求的时候先访问本地端口下的服务,通过Nginx代理到了真实服务器上,并作出响应。


Nginx代理.png

不光 Nginx 可以做反向代理,前端框架像 Vue、umi 都可以配置反向代理来解决跨域问题,当然这种配置是解决开发环境下的跨域问题(不用我们去手动设置浏览器的属性了)。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,236评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,867评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,715评论 0 340
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,899评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,895评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,733评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,085评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,722评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,025评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,696评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,816评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,447评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,057评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,254评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,204评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,561评论 2 343

推荐阅读更多精彩内容