javascript - XMLHttpRequest 分块响应,只读取正在进行的最后一个响应

标签 javascript node.js xmlhttprequest chunked

我正在将分块数据从 NodeJS 应用程序发送回浏览器。这些 block 实际上是 json 字符串。我遇到的问题是每次调用 onprogress 函数时,它都会添加一个完整数据的字符串。这意味着第二个响应 block 附加到第一响应 block ,依此类推。我只想获得“刚刚”收到的数据 block 。

代码如下:

    console.log("Start scan...");
    var xhr = new XMLHttpRequest();
    xhr.responseType = "text";
    xhr.open("GET", "/servers/scan", true);
    xhr.onprogress = function () {
        console.log("PROGRESS:", xhr.responseText);
    }
    xhr.send();

实际上,当第三个响应出现时,xhr.responseText 的内容还包含第一个和第二个响应的响应文本。我已经检查了服务器发送的内容,看起来那里没有问题。将 Node 与 Express 结合使用,并使用 res.send("...") 发送几次。标题也设置如下:

res.setHeader('Transfer-Encoding', 'chunked');
res.setHeader('X-Content-Type-Options', 'nosniff');
res.set('Content-Type', 'text/json');

最佳答案

这种基于索引的方法对我有用:

var last_index = 0;
var xhr = new XMLHttpRequest();
xhr.open("GET", "/servers/scan");
xhr.onprogress = function () {
    var curr_index = xhr.responseText.length;
    if (last_index == curr_index) return; 
    var s = xhr.responseText.substring(last_index, curr_index);
    last_index = curr_index;
    console.log("PROGRESS:", s);
};
xhr.send();

灵感来自 https://friendlybit.com/js/partial-xmlhttprequest-responses/

关于javascript - XMLHttpRequest 分块响应,只读取正在进行的最后一个响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33635919/

相关文章:

javascript - 在 XHR.onreadystatechange 回调中是否有不同于 "4"(完成)的 readyState 的有用用途?

java - 在基于 Java 的网站上动态更新图表

javascript - 为什么在 Moment js 中的 mor ISO 8601 上一天休息 1 小时?

css - 这可能吗?使用 CSS (Stylus) 迭代@keyframes

javascript - 如何获取通过 Node.js 上传到 Azure 存储的文件的 URL?

node.js - 全局安装的 npm-packages 不起作用

javascript - 清除 onScreen 插件中的 setInterval 以在视口(viewport)中更改类

javascript - 获取 url 到 React 组件

php - 在 phalcon 框架中的 xmlhttprequest 情况下如何禁用渲染布局?

android - 在 unity Android 中读取 xml 响应