如何用管道控制node.js中http流的流量
How control the flow of http streaming in node.js with piping
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,只是它的代码更短,而且您不必担心背压细节。
如果您的服务器在写入数据时阻塞了其他客户端,则说明其他地方出现了问题。
相关文章:
- Meteor如何接收HTTP请求
- 在我的情况下,如何进行http请求
- 节点协同与生成器和Promise并行流量控制
- //而不是在src=“”上使用http://"属性
- 我无法使用angularJs($http)访问服务器
- AJAX简单错误.XMLHttpRequest无法加载http://localhost/mpl/getPage.php.
- 如何将PHP get查询转换为Meteor's HTTP.get()
- 角度异步http自动完成
- 什么's本地node.js服务器和python简单http服务器之间的区别
- 角度http服务器页面刷新404s
- http.listen()在运行时接受终端命令
- IIS动态HTTP响应标头
- spring和angularJS(我得到了类似HTTP状态404的错误)
- 存储$http如何从$http函数(Angularjs)外部获取可访问变量中的响应
- 使用node.js http代理测量流量
- 如何使用node.js http-proxy 来记录计算机中的 HTTP 流量
- 如何用管道控制node.js中http流的流量
- nsITraceableChannel,拦截HTTP流量代码
- 是否有可能监控HTTP流量在Chrome使用扩展
- 在Chrome中以编程方式获取所有HTTP标头和流量