我有一个测试 Node 服务器,每隔两秒发送一次带有以下 header 的分块响应:
response.setHeader('Content-Type', 'text/plain')
response.setHeader('Transfer-Encoding', 'chunked')
每两秒,我写出响应:
response.write('Hello World');
当我在端点上进行 curl 时,我每两秒就会收到一个 block :
Hello World
(wait two seconds)
Hello World
(wait two seconds)
Hello World
它的工作原理就像在curl中应该的那样。
对于客户端的 Javascript,我设置了一个新的 XMLHttpRequest
并分配一个函数来为 onprogress
打印出其 responseText
事件。
这是不同浏览器的实现似乎有所不同的地方。
在 Firefox 和 Safari 中,我得到与 curl 时类似的行为。每个“Hello World”都会触发一个 onprogress 事件。
在 Chrome 中,仅当收到所有 block 并且我在服务器端执行 response.end()
时,才会触发 onprogress 事件。当我尝试打印 responseText
时,只打印出一个空字符串。
客户端代码如下:
var xhr = new XMLHttpRequest()
xhr.onprogress = function() {
// Firefox, Safari prints out an accumulation of the chunks
// Chrome prints out an empty string
console.log(xhr.responseText);
}
最佳答案
Chrome 和 IE 都会“嗅探”数据(我相信是前 256 个字节)以检测 mime 类型。使用它来禁用该行为:
response.setHeader('X-Content-Type-Options', 'nosniff');
关于javascript - Chrome 无法像 Firefox、Safari 一样处理分块响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26164705/