代码业务场景
基于chunked模式与后台通信,实现数据交换。
同一套代码,测试运行正常的运行场景:
1 在DevTool的开发环境下,运行正常。
2 在Remote Debug模式下,IOS端测试运行正常。
3 在体验版本下,IOS端运行正常
运行失败的场景:
1 在体验版下,PC端运行出错
2 在Remote Debug模式下,PC端运行出错
__错误信息: __
文字描述:servicewechat.com/wx…c939e3/0/index.js:3 Uncaught ReferenceError: global is not defined
由于无法直接看到index.js下的代码,所以无从定位问题,只能从现象看做推理了…
分析过程以及初步得到的信息:
在Debug模式下,抓取IOS的请求如下:
在PC端的Debug模式下抓取同一个请求如下:
其中两者的差异:
1 响应中缺少了Transfer-Encoding:chunked的设置。(经过分析,Http2本身就不会返回上述信息)
2 二者使用http协议分别为1.1 和2
初步推测的可能:
分析1: 表面原因: The provided value ‘stream’ is not a valid enum value of type XWebXMLHttpRequestResponseType.
基于上述推测,在http2模式下,content-type: text/event-stream的不支持导致了global is not defined的error
分析2: 在目前nginx中的关键配置如下:
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
proxy_buffering off;
chunked_transfer_encoding on;
location /wx/api/v1/ {
proxy_http_version 1.1;
proxy_pass http://127.0.0.1:8090/wx/api/v1/;
proxy_set_header Host $proxy_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_ssl_session_reuse off;
proxy_ssl_server_name on;
proxy_ssl_name $proxy_host;
proxy_ssl_protocols TLSv1
}
其中开启了http2的支持,同时在proxy_http_version中指定了1.1版本。
按照设置,应该可以兼容http2的请求,并将结果顺利返回的。
分析3: 基于在IOS端,可以正常运行和访问的情况来推测,可以理解有以下两种可能性:
可能1: PC端默认使用http2,但是对于stream/chunked模式不支持,或支持的不完整,导致上述问题。
可能2: Nginx配置可能有问题,但是从已有资料来说,个人理解应该不是(如果说的不准确,欢迎大家拍砖)。
可能的解决方案:
方案1: 在PC端,与IOS端保持步调一致,使用http1.1,且支持完整(这里假定http1.1的stream模式之前就已经支持是完整的,只需做一下协议的降级即可,至少在mobile端是OK的)
方案2: 保持http2不变,修复上述问题(微信的responseType支持text和arraybuffer两种)
求助期望
希望帮忙看看这个问题,是否理解正确,且希望能够帮忙定位和解决一下。