NodeJS 检测到成功读取流打开

jutyujz0  于 2023-05-28  发布在  Node.js
关注(0)|答案(1)|浏览(162)

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

vshtjzan

vshtjzan1#

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

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

相关问题