我有一个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
对象从来没有真正启动流,那么它从来没有开始,因此从来没有结束事件。如果有人知道变通方法,请随时回答并获得免费接受的答案。