2

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

我有这样的代码(使用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 数据连同原始请求一起发送)。即便如此,我不知道为什么这会影响事情。

4

1 回答 1

4

可以预见的是,这与 curl vs. 没有任何关系XMLHttpRequest,而是与仅是建议性的事实有关;serverRequest.pause它实际上并没有立即暂停。也就是说,它几乎没有用。

因此,大概在 CURL 的情况下,时机已经足够好,pause实际上可以按预期工作,而在这种XMLHttpRequest情况下,时机已经关闭,并且其中一个"from outside" data事件成功地通过了“建议”暂停。

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

我添加了一个文档拉取请求,希望没有其他人尝试使用pause假设它确实有效。

于 2012-03-22T16:21:45.363 回答