fs createReadStream的事件并不总是被调用

时间:2013-03-01 17:34:45

标签: javascript node.js stream coffeescript fs

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

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

任何“肯定”事件,可以用作删除这些文件而不破坏下载的catch?

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

1 个答案:

答案 0 :(得分:0)

我从来没有找到确保事件被调用的确定方法。我猜测如果response对象永远不会实际启动流,它永远不会启动,因此永远不会有结束事件。如果有人知道解决方法随时回答并获得免费接受的答案。