最快的方法来检查在NodeJs中的文件的存在
我build立一个超级简单的服务器在节点和我的onRequest监听器我试图确定,如果我应该提供一个静态文件(closures磁盘)或一些JSON(可能从mongo拉)基于request.url
的path。
目前我试图首先统计文件(因为我在其他地方使用mtime),如果没有失败,那么我从磁盘读取内容。 像这样的东西:
fs.stat(request.url.pathname, function(err, stat) { if (!err) { fs.readFile(request.url.pathname, function( err, contents) { //serve file }); }else { //either pull data from mongo or serve 404 error } });
除了为request.url.pathname
cachingfs.stat
的结果fs.stat
,有没有什么可以加速这个检查? 例如,如果fs.readFile
错误而不是stat
,它会一样快吗? 或者使用fs.createReadStream
而不是fs.readFile
? 或者我可以检查使用child_process.spawn
东西的文件? 基本上我只是想确保我不会花费任何额外的时间搞乱w / fileio当请求应发送给mongo的数据…
谢谢!
var fs = require('fs'); fs.exists(file, function(exists) { if (exists) { // serve file } else { // mongodb } });
我不认为你应该为此担心,而是如何改进caching机制。 fs.stat
对于文件检查确实没问题,在另一个subprocess中这样做可能会让你放慢速度,而不是在这里帮助你。
Connect在几个月前实现了staticCache()中间件,如以下博客所述: http : //tjholowaychuk.com/post/9682643240/connect-1-7-0-fast-static-file-memory-cache-and -更多
最近使用的(LRU)cachingalgorithm通过
Cache
对象实现,只需在Cache
对象被击中时旋转即可。 这意味着越来越受欢迎的物体保持自己的位置,而其他人则被挤出堆栈并收集垃圾。
其他资源:
http://senchalabs.github.com/connect/middleware-staticCache.html
staticCache的源代码
这个片段可以帮助你
fs = require('fs') ; var path = 'sth' ; fs.stat(path, function(err, stat) { if (err) { if ('ENOENT' == err.code) { //file did'nt exist so for example send 404 to client } else { //it is a server error so for example send 500 to client } } else { //every thing was ok so for example you can read it and send it to client } } );