2013-04-18 34 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

相关问题