检查NodeJ中是否存在文件的最快方法

时间:2012-01-09 01:04:45

标签: performance node.js

我正在节点和我的onRequest监听器中构建一个超级简单的服务器我正在尝试确定是否应该根据路径中的路径提供静态文件(磁盘外)或某些json(可能是从mongo中提取) request.url

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

除了为fs.stat缓存request.url.pathname的结果之外,还有什么可以加快检查的速度吗?例如,看到fs.readFile错误而不是stat会更快吗?或使用fs.createReadStream代替fs.readFile?或者我可以使用child_process.spawn中的内容检查文件吗?基本上我只想确保在将请求发送到mongo以获取数据时,我不会花费任何额外的时间搞乱/ fileio。

谢谢!

4 个答案:

答案 0 :(得分:58)

var fs = require('fs');

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

答案 1 :(得分:2)

我认为您不应该担心这一点,而是如何改进缓存机制。 fs.stat对于文件检查来说真的没问题,在另一个子进程中执行此操作可能会减慢你的速度,而不是在这里帮助你。

几个月前,

Connect实现了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

答案 2 :(得分:2)

此代码段可以帮助您

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
    }
} );

答案 3 :(得分:0)

如果要使用Express服务文件,我建议只使用Express的sendFile错误处理程序

const app = require("express")();

const options = {};
options.root = process.cwd();

var sendFiles = function(res, files) {
  res.sendFile(files.shift(), options, function(err) {
    if (err) {
      console.log(err);
      console.log(files);
      if(files.length === 0) {
        res.status(err.status).end();
      } else {
        sendFiles(res, files)
      }
    } else {
      console.log("Image Sent");
    }
  });
};

app.get("/getPictures", function(req, res, next) {
  const files = [
    "file-does-not-exist.jpg",
    "file-does-not-exist-also.jpg",
    "file-exists.jpg",
    "file-does-not-exist.jpg"
  ];

  sendFiles(res, files);

});

app.listen(8080);

如果该文件不存在,则将转到自发文件的错误。 我在这里https://github.com/dmastag/ex_fs/blob/master/index.js