這是一個非常深奧的問題,我無法提前爲此提供一個小測試用例。但是也許有人遇到過這樣的事情。NodeJS流暫停/恢復不適用於XMLHttpRequest,但適用於curl?
我有這樣的(使用的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 outside"
日誌行少"from inside"
的日誌行。儘管我盡最大努力暫停ASAP,但似乎其中一個數據事件正在消失。
這裏是我使用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數據以及原始請求)。即便如此,我不知道爲什麼這會影響事情。
你得到了這個答案嗎?如果我真的可以使用nodejs暫停/恢復http響應? – akmsharma 2014-06-17 15:56:49