NodeJS流暂停/恢复不适用于XMLHttpRequest,但适用于curl?

时间:2012-03-21 21:16:11

标签: javascript http node.js xmlhttprequest arraybuffer

这是一个非常深奥的问题,我无法提供一个小的测试用例,所以提前抱歉。但也许有人遇到过类似的事情。

我有这样的代码(使用restify):

server.put("/whatever", function (serverRequest, serverResponse, next) {
    serverRequest.pause();

    serverRequest.on("data", function (chunk) {
        console.log("from outside", chunk);
    });

    doSomeAsyncStuff(function (err) {
        serverRequest.on("data", function (chunk) {
            console.log("from inside", chunk);
        });
        serverRequest.on("end", function () {
            next();
        });

        serverRequest.resume();
    });
});

当我使用CURL点击此服务器时,这非常有用。但是当我用XMLHttpRequest命中它时,我得到的"from inside"日志行少于"from outside"日志行。尽管我尽最大努力暂停,但似乎其中一项数据事件正在迷失。


这是我正在使用的CURL命令:

curl -X PUT -T file.pdf http://localhost:7070/whatever -v

以下是XMLHttpRequest代码(适用于最近版本的Chrome):

var arrayBuffer = fromElsewhere();
var xhr = new XMLHttpRequest();

xhr.open("PUT", "http://localhost:7070/whatever");
xhr.setRequestHeader("Content-Length", arrayBuffer.byteLength);
xhr.setRequestHeader("Content-Type", "application/pdf");
xhr.send(arrayBuffer);

一个值得注意的差异是,CURL似乎在上传之前发送Expect: 100-continue,而XMLHttpRequest则不然。我尝试手动添加该标题,但当然它实际上没有做太多(即Chrome没有等待响应,它只是发送了所有PDF数据和原始请求)。即便如此,我也不知道为什么这会影响事情。

1 个答案:

答案 0 :(得分:4)

有些可预见的是,这与卷曲与XMLHttpRequest没有任何关系,而是与the fact that serverRequest.pause is only advisory; it doesn't actually pause right away有关。也就是说,它几乎没用。

因此可能在CURL案例中,时间足够好pause实际上按预期工作,而在XMLHttpRequest情况下时间关闭,"from outside" {{之一1}}事件设法通过“咨询”暂停。

在线程中讨论过,显然有各种各样的修复方法,但我对整个流/缓冲区宇宙仍然很不稳定,所以我不会尝试在这个答案中推荐一个。

我添加了一个documentation pull request,希望没有其他人尝试使用data,假设它确实有效。