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

XMLHttpRequest chunked response, only read last response in progress

本文关键字:响应 正在进行 最后一个 读取 XMLHttpRequest      更新时间:2023-09-26

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

这是代码:

    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/