读取固定大小时,HTTP请求流不可读

时间:2013-12-01 09:28:40

标签: node.js

我正在尝试使用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);

......一切都很好。我的节目继续如预期那样流式传输。

为什么会这样?我该如何解决?

1 个答案:

答案 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);
  });
});