NodeJSstream暂停/恢复不适用于XMLHttpRequest,但与curl?

这是一个相当深奥的问题,我不能提供一个小的testing用例,所以提前抱歉。 但是也许有人遇到过这样的事情。

我有这样的代码(使用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 inside"看到的内容less于"from outside"日志行。 尽pipe我尽最大的努力暂停,但看起来数据事件之一正在迷失。


这是我使用的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数据以及原始请求)。 即使如此,我不知道为什么这会影响事情。

有点可以预见的是,这与curl和XMLHttpRequest没有任何关系,而是与serverRequest.pause只是build议相关; 它实际上并没有立即停下来 。 也就是说,这几乎没用。

所以大概在CURL的情况下,时机已经足够好了, pause实际上按照预期工作,而在XMLHttpRequest情况下,时机已经closures,其中一个"from outside" data事件设法通过“build议”暂停。

显然有不同的修复,在线程中讨论,但我仍然在这整个stream/缓冲区宇宙不稳定,所以我不会尝试推荐一个在这个答案。

我已经添加了一个文档拉请求 ,希望没有人试图使用pause假设它实际上工作。