javascript - 检测成功读取流打开

标签 javascript node.js express 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);
    });
}

那么,基本上,我如何检测文件读取是否成功?如果我监听“数据”事件,我想我会错过第一 block 数据。如果我只是 pipe() 它来响应,响应流会因错误而关闭,并且我无法为它提供获取的数据,并且这种方法确实缺乏灵活性。我想知道是否有方法可以监听诸如 fdcreatedopened 或类似事件,或者有方法推回我在 data 中获得的数据事件,因此它将在下一个 data 事件中重新发送。

最佳答案

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

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

关于javascript - 检测成功读取流打开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24349896/

相关文章:

javascript - 比较数组时 Chai 断言错误

javascript - 在 Bootstrap 中动态更改下拉宽度

node.js - MongoDB - 如何通过 ID 查找文档并查找与 ID 数组匹配的文档

node.js - jspdf 模块每次都会崩溃,并出现 ReferenceError : window is not defined

javascript - 不使用对象的引用(javascript)

javascript - 取消隐藏 <asp :Panel> using javascript

javascript - 如何找到传递给组件的属性确实改变了 ember?

node.js - Mongoose - 如何从对象 ID 数组中查找集合

javascript - 在 8.x 中使用 uuid 进行玩笑 spy On

javascript - Sequelize 关联和 api 路由。无法从数据库检索信息