检测成功读流打开
Detecting successful read stream open
我正在为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()
到响应,响应流就会因为错误而关闭,我不能为它提供获取的数据,这种方法确实缺乏灵活性。我想知道是否有办法收听像fdcreated
或opened
或类似的事件,或者在data
事件中推回数据的方法,所以它将在下一个data
事件中重新发送。
方法createReadStream
返回一个ReadableStream,它也是一个事件open
。您可以为打开的事件添加一个事件处理程序,这样您就可以在管道之前知道资源何时有效:
stream.on('open', function() {
console.log('hit ' + req.url);
stream.pipe(res);
});
相关文章:
- 如何检测是否有溢出
- 尽管链接成功并已成功下载,但未找到NPM模块
- 如何检测用于WebGL的专用或集成显卡
- 防止Alt+Shift默认操作或检测多种操作系统语言的Javascript
- 如何在使用selectBoxIt JQuery插件时检测选项更改
- 如何使用密码检测网络中的状态连接
- 使用JavaScript检测Flash
- 在不阻止默认行为的情况下检测IE10中的缩放
- 检测个位数整数时正在转换毫秒
- 检测 html 表单是成功还是错误
- 检测页面是否在 Grails 中成功呈现
- 如何在我的firefox扩展中检测成功登录
- 如何检测图像加载失败,如果失败,尝试重新加载直到成功
- 使用POST从PhoneGap,移动jQuery应用程序跨域脚本检测成功的html表单提交
- 如何检测如果谷歌地图加载成功
- 检测视频.加载成功与否- javascript
- 检测成功读流打开
- 无法成功检测复选框上的单击或更改事件
- 如何检测Facebook共享成功?使用Javascript
- 如何检测iframe是否打开并成功跳转到ios原生应用程序