在流结束之前调用Node (express.js) next()

时间:2021-08-23 02:33:23

I have the following middleware function

我有以下中间件功能

var bodyParser = require('body-parser'),
  fs = require('fs');
module.exports = function(req, res, next) {
  // Add paths to this array to allow binary uploads
  var pathsAllowingBinaryBody = [
    '/api2/information/upload',
    '/api2/kpi/upload',
  ];

  if (pathsAllowingBinaryBody.indexOf(req._parsedUrl.pathname) !== -1) {
    var date = new Date();
    req.filePath = "uploads/" + date.getTime() + "_" + date.getMilliseconds() + "_" + Math.floor(Math.random() * 1000000000) + "_" + parseInt(req.headers['content-length']);

    var writeStream = fs.createWriteStream(req.filePath);
    req.on('data', function(chunk) {
      writeStream.write(chunk);
    });
    req.on('end', function() {
      writeStream.end();
      next();
    });
  } else {
    bodyParser.json()(req, res, next);
  }
};

The files is being transfered correctly however sadly the next() in the

文件正在被正确地转移,然而不幸的是下一个()在

req.on('end', function() {
  writeStream.end();
  next();
});

is called before it is done writing all data to the new file.

在将所有数据写入新文件之前调用。

My question is what am i doing wrong? And how can i fix it?

我的问题是我做错了什么?我该如何修复它呢?

1 个解决方案

#1


4  

Use the writable file stream's close event to know when the file descriptor has been closed.

使用可写文件流的关闭事件来知道文件描述符何时被关闭。

Replace this:

替换:

var writeStream = fs.createWriteStream(req.filePath);
req.on('data', function(chunk) {
    writeStream.write(chunk);
});
req.on('end', function() {
    writeStream.end();
    next();
});

with this:

用这个:

req.pipe(fs.createWriteStream(req.filePath)).on('close', next);

#1


4  

Use the writable file stream's close event to know when the file descriptor has been closed.

使用可写文件流的关闭事件来知道文件描述符何时被关闭。

Replace this:

替换:

var writeStream = fs.createWriteStream(req.filePath);
req.on('data', function(chunk) {
    writeStream.write(chunk);
});
req.on('end', function() {
    writeStream.end();
    next();
});

with this:

用这个:

req.pipe(fs.createWriteStream(req.filePath)).on('close', next);