2013-04-18 31 views
0

我正在測試流,通過創建一個基本的node.js應用程序代碼,基本上流文件到響應。使用來自herehere的代碼。響應每個請求,而不必等到當前流完成

但是,如果我從http://127.0.0.1:8000/發出請求,然後打開另一個瀏覽器並請求另一個文件,第二個文件將不會開始下載,直到第一個文件完成。在我的例子中,我創建了一個1GB的文件。 dd if=/dev/zero of=file.dat bs=1G count=1

但是,如果我要求三個文件而第一個被下載,這三個文件將開始,一旦第一個文件已完成同時下載。

我該如何更改代碼,以便它在每個請求發出響應時不必等待當前下載完成?

var http = require('http'); 
var fs = require('fs'); 
var i = 1; 

http.createServer(function(req, res) { 

    console.log('starting #' + i++); 
    // This line opens the file as a readable stream 
    var readStream = fs.createReadStream('file.dat', { bufferSize: 64 * 1024 }); 

    // This will wait until we know the readable stream is actually valid before piping 
    readStream.on('open', function() { 
     console.log('open'); 
     // This just pipes the read stream to the response object (which goes to the client) 
     readStream.pipe(res); 
    }); 

    // This catches any errors that happen while creating the readable stream (usually invalid names) 
    readStream.on('error', function(err) { 
     res.end(err); 
    }); 
}).listen(8000); 

console.log('Server running at http://127.0.0.1:8000/'); 
+0

您使用的是哪個版本的節點?流從版本v0.10更改。 http://blog.nodejs.org/2012/12/20/streams2/ – Andrew

+0

不是這個問題了,因爲我已經接受你的答案,但記錄:'v0.10.4' – capdragon

回答

1

你的代碼看起來不錯。 我與節點v0.10.3檢查它通過在多個學期階段中的幾項要求:

$ wget http://127.0.0.1:8000 

兩個請求同期執行。 當使用兩種不同的瀏覽器(例如,Chrome & Safari)時,我會得到相同的結果。 此外,我可以只改變請求URL會略微在Chrome併發下載,如:

http://localhost:8000/foo 

http://localhost:8000/bar 

您所描述的行爲似乎表現從進行多次請求時同樣的瀏覽器相同的網址

這可能是一個瀏覽器限制 - 看起來第二個請求甚至沒有完成或取消第一個請求。

要回答你的問題,如果您需要在瀏覽器中的多個客戶端下載

  1. 確保服務器的代碼實現,使得文件到URL映射爲1對多的(即使用通配符)。
  2. 確保您的客戶端代碼(即瀏覽器中的JavaScript)爲每個請求使用不同的url。
+0

非常有趣。 – capdragon