Javascript 检测成功的读取流打开
我正在为Express.js的静态服务中间件实现缓存,其工作原理如下:当请求到来时,中间件首先尝试从文件系统服务文件,如果没有,则从上游获取文件并存储在文件系统中 问题是我不知道如何正确检测“缓存命中”事件Javascript 检测成功的读取流打开,javascript,node.js,express,connect,methodology,Javascript,Node.js,Express,Connect,Methodology,我正在为Express.js的静态服务中间件实现缓存,其工作原理如下:当请求到来时,中间件首先尝试从文件系统服务文件,如果没有,则从上游获取文件并存储在文件系统中 问题是我不知道如何正确检测“缓存命中”事件 staticMiddleware = function(req, res, next) { // try to read file from fs filename = urlToFilename(req.url); stream = fs.createReadStr
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
事件中重新出现。方法createReadStream
返回一个可读流,它也是一个open
事件。您可以为事件添加事件处理程序,以便在执行管道之前知道资源何时有效:
stream.on('open', function() {
console.log('hit ' + req.url);
stream.pipe(res);
});
正如我提到的,如果我做
stream.once('data',function(chunk){/*hit!*/stream.pipe(req);})
,我丢失了第一个数据块,因为在第一个数据块传递给我之后,pipe()
为数据附加了自己的侦听器。@modchan-my bad:)有一个开放的,甚至你可以附加到,请检查我的编辑。哦,现在我明白了,我为这个事件寻找了一个错误的位置-我认为类似于open
事件应该是ReadableStream
规范的一部分,而不是特定于fs的。谢谢