createeadstream的事件不总是被调用



我有一个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文档,并不是所有流都调用'close'事件。我会使用'end'事件,但是根据文档:Indicates that no more 'data' events will happen. If the stream is also writable, it may be possible to continue writing.

我担心如果我使用'end'事件,你会遇到这个问题吗?如果我删除这些文件,流没有完成写入http响应,它会导致下载失败。

任何"确定"的事件,可以作为一个捕获,以删除这些文件,而不是破坏下载?

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

我从来没有想出一个确保事件被调用的可靠方法。我猜想,如果response对象从来没有真正启动流,那么它从来没有开始,因此从来没有结束事件。如果有人知道变通方法,请随时回答并获得免费接受的答案。

相关内容

  • 没有找到相关文章

最新更新