最快的方法来检查NodeJs中的文件的存在

最快的方法来检查NodeJs中的文件的存在

问题描述:

我在节点和我的onRequest监听器中构建一个超级简单的服务器我想确定是否应该提供静态文件(关闭磁盘)或某些json (可能是从mongo中拉出来的)根据路径request.url最快的方法来检查NodeJs中的文件的存在

目前我试图首先统计文件(因为我在其他地方使用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 
    } 
}); 

比cacheing的fs.stat结果为request.url.pathname其他,是有什么事,可以加速这一检查呢?例如,查看fs.readFile错误而不是stat是否会更快?或者使用fs.createReadStream而不是fs.readFile?或者我可能使用child_process.spawn中的某些内容检查文件?基本上我只是想确保我不会花费任何额外的时间搞乱w/fileio当请求应该发送给mongo的数据...

谢谢!

+4

我根据我的需求总是用'stat'或'statSync'(例如' statSync'在配置文件中),但我猜想在'readfile'和技术上会更快地捕获一个错误(虽然在JS中错误捕获很重,所以我可能是错的)。一般来说,我宁愿使用'stat',因为它比有意抛出错误更清洁。一般情况下避免使用'child_process',因为'node'正在推进Windoze系统,任何使用它的代码都会中断。 – 2012-01-09 01:11:04

+1

@Lite Byte您应该认真接受由DeadDEnD给出的答案... – 2014-05-16 16:06:16

var fs = require('fs'); 

fs.exists(file, function(exists) { 
    if (exists) { 
    // serve file 
    } else { 
    // mongodb 
    } 
}); 
+12

只是FYI,在更高版本的Node中已弃用'path.exists()'。现在它是'fs.exists()'。 – MikeSchinkel 2012-10-07 05:01:01

+0

没错。谢谢。 – fent 2012-10-07 15:04:33

+7

请注意,'file'实际上可以是一个目录,符号链接,管道等。为了仅查找文件,可以使用类似'fs.stat(file,function(err,stats){if(!err && stats。 isFile()){// serve} else {// something else}});'但即使这样也不能保证你可以真正阅读那个文件。权限可能是错误的,或者在实际阅读文件之前可能会删除该文件。根据上下文,解决问题的一种方法可能是尝试读取文件,然后在失败时执行其他操作。节点文档中的 – tuomassalo 2013-03-15 15:29:41

我不认为你应该担心这一点,而是你应该如何改进缓存机制。 fs.stat对于文件检查确实很好,在另一个子进程中这样做可能会让你放慢速度,而不是在这里帮助你。

连接实现的staticCache()中间件几个月前,在这个博客帖子描述:http://tjholowaychuk.com/post/9682643240/connect-1-7-0-fast-static-file-memory-cache-and-more

最近最少使用(LRU)高速缓存算法中通过 Cache对象实现,只需当它们被击中时旋转缓存对象。这个 意味着越来越受欢迎的对象保持自己的位置,而其他人则被挤出堆栈并收集垃圾。

其他资源:
http://senchalabs.github.com/connect/middleware-staticCache.html
The source code for 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 
    } 
});