将stream转换成缓冲区?

如何将stream转换成nodejs中的缓冲区? 这是我的代码parsing文件中的快递请求中的文件。

app.post('/upload', express.multipart({ defer: true }), function(req, res) { req.form.on('part', function(part) { //Here I want to convert the streaming part into a buffer. //do something buffer-specific task var out = fs.createWriteStream('image/' + part.filename); part.pipe(out); }); req.form.on('close', function() { res.send('uploaded!'); }); }); 

       

网上收集的解决方案 "将stream转换成缓冲区?"

您可以使用stream-to模块,它可以将可读stream的数据转换为数组或缓冲区:

 var streamTo = require('stream-to'); req.form.on('part', function (part) { streamTo.buffer(part, function (err, buffer) { // Insert your business logic here }); }); 

如果你想更好地理解幕后发生的事情,你可以使用Writablestream自己实现逻辑。 作为一个可写的stream实现器,你只需要定义一个函数: _write方法 ,每次将一些数据写入stream时都会被调用。 当inputstream完成发送数据时,会发出end事件 :然后使用Buffer.concat方法创build一个缓冲区。

 var stream = require('stream'); var converter = new stream.Writable(); converter.data = []; // We'll store all the data inside this array converter._write = function (chunk) { this.data.push(chunk); }; converter.on('end', function() { // Will be emitted when the input stream has ended, ie. no more data will be provided var b = Buffer.concat(this.data); // Create a buffer from all the received chunks // Insert your business logic here }); 

您可以将dataend事件处理程序附加到partstream来读取它,而不是pipe道:

 var buffers = []; part.on('data', function(buffer) { buffers.push(buffer); }); part.on('end', function() { var buffer = Buffer.concat(buffers); ...do your stuff... // write to file: fs.writeFile('image/' + part.filename, buffer, function(err) { // handle error, return response, etc... }); }); 

但是,这会将整个上传读入内存。 如果这是一个问题,您可能需要考虑创build一个自定义转换stream来转换传入的数据,但这可能不是微不足道的。