2012-03-21 99 views
2

這是一個非常深奧的問題,我無法提前爲此提供一個小測試用例。但是也許有人遇到過這樣的事情。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數據以及原始請求)。即便如此,我不知道爲什麼這會影響事情。

+0

你得到了這個答案嗎?如果我真的可以使用nodejs暫停/恢復http響應? – akmsharma 2014-06-17 15:56:49

回答

3

有些可預見的是,這與捲曲與XMLHttpRequest沒有任何關係,而是與the fact that serverRequest.pause is only advisory; it doesn't actually pause right away相反。也就是說,它幾乎沒用。

所以在捲曲的情況下大概的時間是不夠好是pause實際工作不如預期,而在XMLHttpRequest情況下,時機斷,"from outside"data事件之一設法通過「諮詢」暫停滑倒。

有明顯這方面的修正,在線程討論,但我仍然在這整個流/緩衝器宇宙相當不穩,所以我不會嘗試推薦一個在這個答案。

我已經添加了一個documentation pull request希望沒有人試圖使用pause假設它實際上工作。

+0

好吧,'暫停'*工作*,但正如你所說,它是諮詢,異步。一個非常有用的'暫停'用例就是在代理中:從上游讀取並寫入客戶端。如果寫入客戶端返回「false」,則表示緩衝區已滿,並且可以向後端發送「暫停」。您可能會從後端收到一些額外的數據塊,但不會包含所有文件。如果沒有暫停,進行代理1個GB的文件會導致緩存到內存中的整個文件(和你的Node.js進程爆炸)。我希望這有幫助! – jpetazzo 2012-11-04 15:46:55

相關問題