检测成功读流打开

Detecting successful read stream open

本文关键字:成功 检测      更新时间:2023-09-26

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

问题是我不知道如何正确检测" cache hit "事件。

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()到响应,响应流就会因为错误而关闭,我不能为它提供获取的数据,这种方法确实缺乏灵活性。我想知道是否有办法收听像fdcreatedopened或类似的事件,或者在data事件中推回数据的方法,所以它将在下一个data事件中重新发送。

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

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