javascript - Chrome 无法像 Firefox、Safari 一样处理分块响应

标签 javascript ajax node.js google-chrome xmlhttprequest

我有一个测试 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/

相关文章:

javascript - 如何将大数据发送到网络服务?

javascript - react-router-dom 元素类型无效

javascript - Jquery Tokeninput 和动态嵌套表单

Node.js:Google Analytics API:如何使用 "service account"发出授权的只读管理 API 请求?

javascript - 在 Node.js 项目中连接多个 Mongo DB

javascript - 设计 AJAX 应用程序的推荐方法

javascript - 更改模板标签后 John Resig 的微模板出现语法错误 <# {% {{ 等

javascript - 从1.3.2升级到1.8.3时jquery ajax成功

javascript - 发送电子邮件时出现 Node.js 404 错误,忽略了我的 res.status

javascript - 如何从 CI 构建管道发布 NPM 包并仍然自动化版本控制?