【问题标题】:How control the flow of http streaming in node.js with piping如何使用管道控制 node.js 中 http 流的流量
【发布时间】: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(),请告诉我如何使用resumepause 函数控制管道的流量

【问题讨论】:

    标签: javascript node.js http stream pipe


    【解决方案1】:

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

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

    【讨论】:

    • 这是我的整个流代码,gist.github.com/ramin2nt2/6a53c88d8ffb64744751 你能告诉我哪里出错了吗?
    • 代码在我看来没问题。你能解释一下“没有回应”吗?是不是您无法在 2 或 3 个待处理请求之后发出请求(如果是这样,也许您正在达到浏览器的每个站点连接限制)?还是您在发出一定数量的请求并且没有其他请求待处理时无法发出新请求?
    • 实际上,我想我可能明白您现在遇到问题的原因了。尝试将stream = fs.createReadStream(filename); 更改为var stream = fs.createReadStream(filename); 并删除var stream = require('stream');。当使用stream 的当前值触发各种事件时,拥有该共享stream 对象可能会导致问题(导致对其他请求的流执行操作)。
    • 感谢您的回复。我做了你的建议。这是代码gist.github.com/ramin2nt2/c5c22a4c4aee7b00345e。但节点应用程序仍会对一个用户做出响应,其他请求仍将等待处理。
    猜你喜欢
    • 1970-01-01
    • 2021-05-16
    • 1970-01-01
    • 1970-01-01
    • 2015-02-10
    • 1970-01-01
    • 2014-03-17
    • 2016-04-18
    • 1970-01-01
    相关资源
    最近更新 更多