Node.js 将流转换为缓冲区?

Node.js 将流转换为缓冲区?,node.js,Node.js,如何在nodejs中将流转换为缓冲区?下面是我在express中解析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-specif

如何在nodejs中将流转换为缓冲区?下面是我在express中解析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!');
  });
});

您可以将
数据
结束
事件处理程序附加到
部分
流以读取,而不是管道:

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...
  });
});
但是,这会将整个上载读取到内存中。如果这是一个问题,您可能需要考虑创建一个自定义来转换传入的数据,但这可能不是微不足道的。

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

var streamTo = require('stream-to');
req.form.on('part', function (part) {
  streamTo.buffer(part, function (err, buffer) {
    // Insert your business logic here
  });
});
如果您想更好地了解幕后发生的事情,您可以使用一个简单的工具自己实现逻辑。作为一个可写流实现者,您只需要定义一个函数:the,它将在每次向流写入数据时调用。当输入流完成发送数据时,将发送:然后我们将使用创建一个缓冲区


对于可写流,我认为事件是
finish
,而不是
end
。它们的意思是相同的,但它们的命名需要不同,因为它们在转换时共存<代码>流到已弃用,并替换为
流到数组
原始正文
。如果没有模块或库呢?
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
});