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
假设它实际上工作。