我正在为Express.js的静态服务中间件实现缓存,其工作原理如下-当请求到来时,中间件首先尝试从文件系统中提供文件,如果没有,则从上游获取文件并存储在文件系统中。
问题是我不知道如何正确检测“缓存命中”事件。
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);
});
}
那么,基本上,我如何检测成功的文件阅读?如果我监听'data'事件,我想我错过了第一个数据块。如果我只是pipe()
它到响应,响应流会在错误时关闭,我不能用获取的数据来服务它,这种方法确实缺乏灵活性。我想知道是否有办法监听像fdcreated
或opened
或类似的事件,或者推回我在data
事件中获得的数据的方法,这样它将在下一个data
事件中重新发送。
1条答案
按热度按时间vshtjzan1#
方法
createReadStream
返回一个ReadableStream,它也是一个事件open
。您可以为open事件添加事件处理程序,以便在管道之前知道资源何时有效: