正如 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/