我有一个关于缓冲区的问题。这是我的代码:
var Grid = require('gridfs-stream');
var mongodb = require('mongodb');
var gfs = Grid(db, mongodb);
var deferred = Q.defer();
var image_buf = new Buffer('buffer');
var readableStream = gfs.createReadStream(name);
readableStream.on('data',function(chunk){
console.log(chunk);
image_buf = Buffer.concat([image_buf, chunk]);
console.log(image_buf)//differ from the chunk above
});
readableStream.on('end',function(){
db.close();
deferred.resolve(image_buf);
})
return deferred.promise;
我正在做的是从MongoDB读取图像并将其放入gridfs-stream中。我真的想要检索流中的所有块并将它们传递给另一个变量,以便我可以重用这些块来在另一个API中绘制图像。因此我使用image_buf和Buffer来执行任务。但是,我得到一个完全不同的缓冲区字符串。正如你在上面的代码中看到的那样,我安慰了我得到的chunk和image_buf,但它们完全不同。任何人都可以告诉我这个的原因,我怎样才能正确收集所有块?非常感谢!!!
更新:好的,所以我现在想出来了:我会在下面附上我的代码给那些正在努力解决同样问题的人:
readableStream.on('data',function(chunk){
console.log("writing!!!");
if (!image_buf)
image_buf = chunk;
else image_buf = Buffer.concat([image_buf, chunk]);
});
答案 0 :(得分:0)
问题发布者提供的更新无效。因此,我将提供自己的答案。与其使用new Buffer('buffer')
,不如使用一个简单的数组并将块推入其中,并在末尾使用Buffer.concat(bufferArray)
来获取流的缓冲区,如下所示:
var readableStream = gfs.createReadStream(name);
var bufferArray = [];
readableStream.on('data',function(chunk){
bufferArray.push(chunk);
});
readableStream.on('end',function(){
var buffer = Buffer.concat(bufferArray);
deferred.resolve(buffer);
})