读取固定大小时,HTTP请求stream不会触发

我正尝试在Node.js中使用新的Streams API,但在指定固定的读取缓冲区大小时遇到​​麻烦。

var http = require('http'); var req = http.get('http://143.226.75.100/waug_mp3_128k', function (res) { res.on('readable', function () { var receiveBuffer = res.read(1024); console.log(receiveBuffer.length); }); }); 

这段代码将接收一些缓冲区,然后退出。 但是,如果我在console.log()行之后添加此行:

 res.read(0); 

…一切都很好。 我的节目继续如预期地stream。

为什么发生这种情况? 我该如何解决?

这里解释。

据我了解,通过读取每个readable事件只有1024个字节,节点是假设你对stream缓冲区中的其余数据不感兴趣,并丢弃它。 发出read(0) (在同一个事件循环迭代中)'重置'这个行为。 我不知道为什么进程读取了几个1024字节的缓冲区后退出; 我可以重新创build它,但我还不明白

如果您没有具体的理由使用1024字节的读取,只需读取每个事件的整个缓冲区:

 var receiveBuffer = res.read(); 

或者,而不是使用非stream动模式,而是通过使用data/end事件来使用stream动模式:

 var http = require('http'); var req = http.get('http://143.226.75.100/waug_mp3_128k', function (res) { var chunks = []; res.on('data', function(chunk) { chunks.push(chunk); console.log('chunk:', chunk.length); }); res.on('end', function() { var result = Buffer.concat(chunks); console.log('final result:', result.length); }); });