这是一个非常深奥的问题,我无法提供一个小的测试用例,所以提前抱歉。但也许有人遇到过类似的事情。
我有这样的代码(使用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数据和原始请求)。即便如此,我也不知道为什么这会影响事情。
答案 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
,假设它确实有效。