我有一个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)。
答案 0 :(得分:0)
我从来没有找到确保事件被调用的确定方法。我猜测如果response
对象永远不会实际启动流,它永远不会启动,因此永远不会有结束事件。如果有人知道解决方法随时回答并获得免费接受的答案。