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

标签 javascript node.js http stream pipe

正如 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 响应的流程。 当response buffer满了,stream不能写数据,stream会暂停,当response变成drain stream会恢复

我的问题

当我使用解决方案 #2 时,我的 Node 应用程序将停止站并且不响应其他客户端。这意味着它一次只为一个客户服务! 我认为会出现此问题是因为 Node 等待将 res.end() 发送到客户端并结束响应。但我不明白如何解决这个问题。

如果这个解决方案完全错误,我只需要使用 stream.pipe() 请告诉我如何使用 resume 控制管道流>暂停函数

最佳答案

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

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

关于javascript - 如何使用管道控制node.js中http流的流量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26223339/

相关文章:

javascript - 是否可以在房间中收听加入和离开事件?

java - Netty4 添加 HttpChunkAggregator

java - RFC 2388 多部分 POST 的服务器实现与 RFC 2047 冲突?

web-services - 如何理解 SOAP Web 服务仅使用 HTTP 进行传输?

javascript - Node.js 回调困惑

javascript - 我们何时使用 preventDefault 方法重要吗?

javascript - 共享点 : Add css and javascript to a web part page

javascript - 我怎样才能停止发送 promise ,直到 for-each 循环生成一个将作为 promise 发送的数组

javascript - 从 Html 表单 Meteor javascript 获取 Var 时出错

node.js - 尝试将文件加载到服务器时无法发布/上传。穆尔特