如何用管道控制node.js中http流的流量

How control the flow of http streaming in node.js with piping

本文关键字:http 流量 js 何用 管道 控制 node      更新时间:2023-09-26

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(),请告诉我如何使用resumepause功能

控制管道流量

解决方案#1基本上等同于#2,只是它的代码更短,而且您不必担心背压细节。

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