如何在Node.js中“累积”原始流?

时间:2012-05-21 13:54:41

标签: node.js stream

目前我将所有内容连接成一个字符串,如下所示

var body = '';
res.on('data', function(chunk){
    body += chunk;
});

如何保存和累积原始流,以便将原始字节传递给期望字节而不是字符串的函数?

3 个答案:

答案 0 :(得分:26)

更好地使用Buffer.concat - 更简单。可在Node v0.8 +。

中使用
var chunks = [];
res.on('data', function(chunk) { chunks.push(chunk); });
res.on('end', function() {
    var body = Buffer.concat(chunks);
    // Do work with body.
});

答案 1 :(得分:9)

首先,检查这些函数实际上是否需要一次性完成所有字节。他们真的应该接受'data'事件,这样你就可以按照收到的顺序传递缓冲区。

无论如何,这是一种连接所有数据块缓冲区而不解码它们的强力方法:

var bodyparts = [];
var bodylength = 0;
res.on('data', function(chunk){
    bodyparts.push(chunk);
    bodylength += chunk.length;
});
res.on('end', function(){
    var body = new Buffer(bodylength);
    var bodyPos=0;
    for (var i=0; i < bodyparts.length; i++) {
        bodyparts[i].copy(body, bodyPos, 0, bodyparts[i].length);
        bodyPos += bodyparts[i].length;
    }
    doStuffWith(body); // yay
});

答案 2 :(得分:1)

Alternately, you can also use a node.js library like bl or concat-stream:

'use strict'
let http = require('http')
let bl = require('bl')
http.get(url, function (response) {
  response.pipe(bl(function (err, data) {
    if (err)
      return console.error(err)
    console.log(data)
  }))
})