У меня есть файловый поток fs, который используется для загрузки файлов, которые создаются динамически. Я получаю этот поток и передаю его в свой объект ответа после установки соответствующих заголовков.
Я также устанавливаю пару потоковых событий, чтобы в случае ошибки или завершения потока сгенерированные файлы удалялись из файловой системы.
Я столкнулся с проблемой, когда иногда, когда загрузка не была правильно инициализирована или завершена, в файловой системе могут остаться некоторые зависшие файлы. Я считаю, что это из-за событий, которые я подключаю к потоку.
Мой код:
stream = fs.createReadStream( fileName, {bufferSize: 64*1024})
had_error = false;
stream.on 'error', (err) ->
had_error = err
stream.on 'close', ->
if had_error
console.log(had_error)
fs.unlink fileName, (error) ->
if error
console.log("DELETE ERROR")
console.log error
fs.unlink dataFileName, (error) ->
if error
console.log("DELETE ERROR")
console.log error
Проверяя документацию по stream API, событие close вызывается не всеми потоками. Я бы использовал событие "конец", однако согласно документам: Indicates that no more 'data' events will happen. If the stream is also writable, it may be possible to continue writing.
Я беспокоюсь, если бы я использовал событие «конец», могли бы вы столкнуться с проблемой, когда, если я удалю эти файлы, а поток не закончит запись в ответ http, это приведет к поврежденной загрузке.
Любое событие «наверняка», которое можно использовать в качестве уловки, чтобы удалить эти файлы и не прерывать загрузку?
В худшем случае я пишу cronjob для удаления этих файлов (bleh).