将流转换为缓冲区?

sam*_*rav 26 node.js

如何在nodejs中将流转换为缓冲区?这是我在快递中的post请求中解析文件的代码.

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!');
  });
});
Run Code Online (Sandbox Code Playgroud)

rob*_*lep 37

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

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...
  });
});
Run Code Online (Sandbox Code Playgroud)

但是,这读取整个上传到内存中.如果这是一个问题,您可能需要考虑创建自定义转换流来转换传入数据,但这可能不是一件容易的事.

  • 呸!根据记录,我并不是在批评你的风格 - 我只是担心那些试图使用从“可读”事件发送的参数的可怜的开发人员:) (2认同)

Pau*_*gel 15

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

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

如果您想更好地了解幕后发生的事情,可以使用Writable自己实现逻辑.作为可写流实现器,您只需定义一个函数:该_write方法,每次将某些数据写入流时将调用该方法.当输入流完成发射数据时,将发出end事件:然后我们将使用该Buffer.concat方法创建缓冲区.

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
});
Run Code Online (Sandbox Code Playgroud)

  • 对于可写流,我相信事件是`finish`,而不是`end`.它们都意味着相同的东西,但它们需要以不同的名称命名,因为它们在Transform上共存.https://nodejs.org/api/stream.html#stream_event_finish (4认同)
  • 没有模块或库怎么办? (3认同)