我为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);
});
}
所以,基本上,我如何检测成功的文件读取?如果我倾听数据'事件,我想我错过了第一块数据。如果我只是pipe()
它的响应,响应流会因错误而关闭,我无法使用获取的数据提供服务,而这种方法确实缺乏灵活性。我想知道是否有办法倾听像fdcreated
或opened
或类似的事件,或者推翻我在data
事件中收到的数据的方式,所以它会被重新发送在下一个data
活动中。
答案 0 :(得分:2)
方法createReadStream
返回一个ReadableStream,它也是一个事件open
。您可以为open事件添加事件处理程序,以便在管道之前知道资源何时有效:
stream.on('open', function() {
console.log('hit ' + req.url);
stream.pipe(res);
});