Node.js开发人员知道,Node可以通过管道将流传输到另一个资源,如http响应。
解决方案#1
http.createServer(function (req, res) {
stream = fs.createReadStream(filename);
stream.pipe(res);
});
解决方案#2
还有另一种方法可以在没有管道的情况下控制流和缓冲响应的流量
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();
});
});
解决方案#2比#1好吗
我认为这更好,因为我们可以控制流到http响应的流量。当响应缓冲区已满,流无法写入数据时,流将暂停,当响应变为耗尽时,流会恢复
我的问题
当我使用解决方案#2时,我的节点应用程序将停止工作站,而不响应其他客户端。这意味着它一次只能为一个客户端提供服务!我认为这个问题会发生,因为节点正在等待向客户端发送res.end()
并结束响应。但我不明白如何解决这个问题。
如果这个解决方案是绝对错误的,我只需要使用stream.pipe()
,请告诉我如何使用resume
和pause
功能
解决方案#1基本上等同于#2,只是它的代码更短,而且您不必担心背压细节。
如果您的服务器在写入数据时阻塞了其他客户端,则说明其他地方出现了问题。