0

我有一个 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

检查流 API文档,并非所有流都调用“关闭”事件。我会使用“结束”事件,但是根据文档:Indicates that no more 'data' events will happen. If the stream is also writable, it may be possible to continue writing.

我担心如果我要使用“结束”事件,您是否会遇到这样的问题:如果我删除这些文件并且流未完成对 http 响应的写入,这将导致下载损坏。

任何“确定”事件可以用作删除这些文件而不中断下载的捕获?

最坏的情况是我写了一个 cronjob 来删除这些文件(bleh)。

4

1 回答 1

0

我从来没有想出确保事件被调用的可靠方法。我猜如果response对象从未真正启动流,它就永远不会启动,因此永远不会有结束事件。如果有人知道解决方法,请随时回答并获得免费接受的答案。

于 2013-04-18T20:50:07.120 回答