我正在尝试使用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);
......一切都很好。我的节目继续如预期那样流式传输。
为什么会这样?我该如何解决?
答案 0 :(得分:3)
解释here。
据我了解,通过每个readable
事件只读取1024个字节,Node可以假设您对流缓冲区中的其余数据不感兴趣,并将其丢弃。发出read(0)
(在相同的事件循环迭代中)'重置'此行为。我不确定为什么在读取几个1024字节的缓冲区之后进程会退出;我可以重新创建它,但我还不明白:)
如果您没有特定的理由使用1024字节的读取,只需读取每个事件的整个缓冲区:
var receiveBuffer = res.read();
或者不使用非流动模式,而是使用data/end
事件来使用流动模式:
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);
});
});