检测成功的读取流打开

时间:2014-06-22 09:27:23

标签: 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.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活动中。

1 个答案:

答案 0 :(得分:2)

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

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