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