11

現時点では、次のようにすべてを文字列に連結します

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

文字列ではなくバイトを期待している関数に生のバイトを渡すことができるように、生のストリームを保存して蓄積するにはどうすればよいですか?

4

3 に答える 3

34

Buffer.concatを使用する方が良い- はるかに簡単です。ノード 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.
});
于 2014-04-25T22:30:35.583 に答える
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
});
于 2012-05-21T14:56:26.860 に答える
1

または、bl や concat-stream などの node.js ライブラリを使用することもできます。

'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)
  }))
})
于 2016-03-02T20:00:53.520 に答える