【发布时间】:2014-12-01 03:10:37
【问题描述】:
正如 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 函数控制管道的流量
【问题讨论】:
标签: javascript node.js http stream pipe