我正在为 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);
});
}
那么,基本上,我如何检测文件读取是否成功?如果我监听“数据”事件,我想我会错过第一 block 数据。如果我只是 pipe()
它来响应,响应流会因错误而关闭,并且我无法为它提供获取的数据,并且这种方法确实缺乏灵活性。我想知道是否有方法可以监听诸如 fdcreated
或 opened
或类似事件,或者有方法推回我在 data
中获得的数据事件,因此它将在下一个 data
事件中重新发送。
最佳答案
方法createReadStream
返回一个ReadableStream,它也是一个事件open
。您可以为 open 添加事件处理程序事件,以便您在管道传输之前知道资源何时有效:
stream.on('open', function() {
console.log('hit ' + req.url);
stream.pipe(res);
});
关于javascript - 检测成功读取流打开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24349896/