检测成功读取stream打开

我正在为Express.js实现静态服务中间件的caching,其工作原理如下 – 请求到达时,中间件首先尝试从文件系统提供文件,如果没有,则从上游提取文件并存储在文件系统中。

问题是我不知道如何正确检测“caching命中”事件。

staticMiddleware = function(req, res, next) { // try to read file from fs filename = urlToFilename(req.url); stream = fs.createReadStream(filename); // cache miss - file not found stream.on('error', function() { console.log('miss ' + req.url); // get file from upstream, store it into fs and serve as response stream = fetchFromUpstream(url); stream.pipe(fs.createWriteStream(filename)); stream.pipe(res); }); // cache hit - file is being read I_DONT_KNOW_WHAT_TO_PUT_HERE(function() { console.log('hit ' + req.url); stream.pipe(res); }); } 

所以,基本上,我怎么能检测成功的文件阅读? 如果我听“数据”事件,我想我错过了第一批数据。 如果我只是用pipe()来响应,响应stream就会被错误地closures,而我不能用提取的数据来处理它,这种方法真的缺乏灵活性。 我想知道是否有办法监听fdcreated或者opened或者类似的事件,或者是推回data事件中的data ,所以会在下一个data事件中重新发送。

方法createReadStream返回一个也open一个事件的ReadableStream。 您可以为打开的事件添加事件处理程序,以便在pipe道之前知道资源何时有效:

 stream.on('open', function() { console.log('hit ' + req.url); stream.pipe(res); });