CreateReadStream(). pipe() Обратный звонок

Извините, у меня есть несколько вопросов о createReadStream() здесь.

В основном то, что я делаю, это динамическое создание файла и его потоковая передача пользователю с использованием fs после его завершения. Я использую .pipe(), чтобы убедиться, что я правильно дросселирую (перестаньте читать, если буфер заполнен, начните снова, если нет, и т.д.) Вот пример моего кода, который у меня есть до сих пор.

http.createServer(function(req, res) {
  var stream = fs.createReadStream('<filepath>/example.pdf', {bufferSize: 64 * 1024})

  stream.pipe(res);

}).listen(3002, function() {
  console.log('Server listening on port 3002')
})

Я прочитал в другом вопросе StackOverflow (извините, потерял его), что если вы используете обычные res.send() и res.end(), что .pipe() отлично работает, так как он вызывает .send и .end и добавляет дросселирование.

Это работает отлично для большинства случаев, за исключением того, что я хочу удалить файл после завершения потока и не использовать .pipe() означает, что мне придется обрабатывать дросселирование только для того, чтобы получить обратный вызов.

Итак, я предполагаю, что мне захочется создать свой собственный поддельный объект res, который имеет методы .send() и .end(), который выполняет то, что обычно выполняет res, однако на .end() Я положу дополнительный код для очистки созданного файла. Мой вопрос в основном, как я могу снять это?

Помогите с этим было бы очень благодарно, спасибо!

Ответ 1

На первую часть, посвященную загрузке, можно ответить Загрузить файл с NodeJS-сервера.

Как для удаления файла после его отправки, вы можете просто добавить свой собственный обработчик событий, чтобы удалить файл, как только все будет отправлено.

var stream = fs.createReadStream('<filepath>/example.pdf', {bufferSize: 64 * 1024})
stream.pipe(res);

var had_error = false;
stream.on('error', function(err){
  had_error = true;
});
stream.on('close', function(){
  if (!had_error) fs.unlink('<filepath>/example.pdf');
});

Обработчик error не нужен на 100%, но тогда вы не удаляете файл, если была ошибка, когда вы пытались его отправить.