【发布时间】:2012-05-28 00:49:15
【问题描述】:
目前我将所有内容连接成一个字符串,如下所示
var body = '';
res.on('data', function(chunk){
body += chunk;
});
如何保存和累积原始流,以便将原始字节传递给期望字节而不是字符串的函数?
【问题讨论】:
目前我将所有内容连接成一个字符串,如下所示
var body = '';
res.on('data', function(chunk){
body += chunk;
});
如何保存和累积原始流,以便将原始字节传递给期望字节而不是字符串的函数?
【问题讨论】:
更好地使用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.
});
【讨论】:
[ERR_INVALID_ARG_TYPE]: The "list[0]" argument must be one of type Buffer or Uint8Array. Received type string
首先,检查这些函数实际上是否需要一次性使用所有字节。他们确实应该接受'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
});
【讨论】:
.copy()方法?
或者,您也可以使用 node.js 库,例如 bl 或 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)
}))
})
【讨论】: