如何通过pipe道控制node.js中httpstream的stream动

正如Node.js开发人员所知道的,节点可以将stream传输到另一个资源,如http响应。

解决scheme#1

http.createServer(function (req, res) { stream = fs.createReadStream(filename); stream.pipe(res); }); 

解决scheme#2

还有另外一种方法来控制不需要pipe道的stream和缓冲区响应stream

 http.createServer(function (req, res) { stream = fs.createReadStream(filename); stream.on('data', function(data) { if (res.write(data) == false){ stream.pause(); } }); stream.on('end', function(data) { res.end(); }); res.on('drain', function(data) { stream.resume(); }); }); 

解决scheme#2比#1好吗?

我认为这样更好,因为我们可以控制stream向http响应的stream。 当响应缓冲区满并且stream不能写入数据时,stream将暂停,并且当响应成为排放stream时将恢复

我的问题

当我使用解决scheme#2时,我的节点应用程序将停止工作站而不响应其他客户端。 这意味着它一次只能服务于一个客户! 我觉得这个问题会发生,因为节点正在等待发送res.end()到客户端并结束响应。 但我不明白如何解决这个问题。

如果这个解决scheme是绝对错误的,我只需要使用stream.pipe()请告诉我如何使用resumepause函数来控制pipe道的stream动

解决scheme#1基本上等同于#2,除了代码较短,您不必担心背压细节。

如果您的服务器在写入数据时阻塞了其他客户端,则其他地方有问题。