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