Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 检测成功的读取流打开_Javascript_Node.js_Express_Connect_Methodology - Fatal编程技术网

Javascript 检测成功的读取流打开

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

我正在为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()
将其发送到响应,则响应流会在出现错误时关闭,并且我无法为其提供获取的数据,这种方法确实缺乏灵活性。我想知道是否有办法监听像
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的。谢谢