读取固定大小时,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); }); });