如何通过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()
请告诉我如何使用resume
和pause
函数来控制pipe道的stream动
解决scheme#1基本上等同于#2,除了代码较短,您不必担心背压细节。
如果您的服务器在写入数据时阻塞了其他客户端,则其他地方有问题。