События для fs createReadStream не всегда вызываются

У меня есть файловый поток 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).


person AlbertEngelB    schedule 01.03.2013    source источник
comment
На какой версии Node.js вы работаете?   -  person Golo Roden    schedule 02.03.2013
comment
Хорошо, тогда у меня нет идеи. Но: В 0.9.x (и грядущей 0.10.x) поведение потоков чтения все равно изменится. Я думаю, вы захотите взглянуть на blog.nodejs.org/2012/ 12/20/streams2, даже если это не решит вашу текущую проблему.   -  person Golo Roden    schedule 02.03.2013
comment
Сладкий, спасибо за будущую информацию. Похоже, эта проблема возникает только в том случае, если пользователь дважды щелкает ссылку на файл. Собираюсь попробовать, используя событие «конец», и посмотреть, решит ли это проблему для меня.   -  person AlbertEngelB    schedule 02.03.2013
comment
Удачи в этом :-)   -  person Golo Roden    schedule 02.03.2013
comment
Хаха спасибо. К сожалению, другое событие не решает проблему. Я предполагаю, что это может быть потому, что у меня есть маршрут, который получает этот поток из другой функции, а затем использует этот поток через обратный вызов. Если кто-то дважды щелкнет по нему, ответ сервера никогда не сработает, поэтому событие «конец» не произойдет (я думаю).   -  person AlbertEngelB    schedule 02.03.2013


Ответы (1)


Я так и не нашел безошибочного способа гарантировать, что событие будет вызвано. Я предполагаю, что если объект response никогда не запускает поток, он никогда не запускается, поэтому никогда не имеет конечного события. Если кто-нибудь знает обходной путь, не стесняйтесь ответить и получить бесплатный принятый ответ.

person AlbertEngelB    schedule 18.04.2013