Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 读取固定大小时HTTP请求流不可读_Node.js - Fatal编程技术网

Node.js 读取固定大小时HTTP请求流不可读

Node.js 读取固定大小时HTTP请求流不可读,node.js,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.l

我试图在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);
。。。一切又好了。我的节目继续按预期播放

为什么会这样?我如何修理它?

已经解释过了

据我所知,通过对每个
readable
事件只读取1024个字节,节点就可以假定您对流缓冲区中的其余数据不感兴趣,并丢弃它。发出
读取(0)
(在同一事件循环迭代中)“重置”此行为。不过,我不知道为什么读取了几个1024字节的缓冲区后进程会退出;我可以重新创建它,但我还不明白:)

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

var receiveBuffer = res.read();
或者,不要使用非流动模式,而是通过使用
数据/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);
  });
});
已经解释过了

据我所知,通过对每个
readable
事件只读取1024个字节,节点就可以假定您对流缓冲区中的其余数据不感兴趣,并丢弃它。发出
读取(0)
(在同一事件循环迭代中)“重置”此行为。不过,我不知道为什么读取了几个1024字节的缓冲区后进程会退出;我可以重新创建它,但我还不明白:)

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

var receiveBuffer = res.read();
或者,不要使用非流动模式,而是通过使用
数据/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);
  });
});

哇!这似乎是一个非常糟糕的API。希望他们在锁定到1.x之前把它清理干净。谢谢你的信息!哇!这似乎是一个非常糟糕的API。希望他们在锁定到1.x之前把它清理干净。谢谢你的信息!