Fastest way to check for existence of a file in NodeJs

31,604

Solution 1

var fs = require('fs');

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

Solution 2

this snippet can help you

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

Solution 3

I don't think you should be worrying about that, but rather how can you improve the caching mechanism. fs.stat is really ok for file checking, doing that in another child process would probably slow you down rather then help you here.

Connect implemented the staticCache() middleware a few months ago, as described in this blog post: http://tjholowaychuk.com/post/9682643240/connect-1-7-0-fast-static-file-memory-cache-and-more

A Least-Recently-Used (LRU) cache algo is implemented through the Cache object, simply rotating cache objects as they are hit. This means that increasingly popular objects maintain their positions while others get shoved out of the stack and garbage collected.

Other resources:
http://senchalabs.github.com/connect/middleware-staticCache.html
The source code for staticCache

Share:
31,604
Lite Byte
Author by

Lite Byte

Updated on July 09, 2022

Comments

  • Lite Byte
    Lite Byte almost 2 years

    I'm building a super simple server in node and in my onRequest listener I'm trying to determine if I should serve a static file (off the disk) or some json (probably pulled from mongo) based on the path in request.url.

    Currently I'm trying to stat the file first (because I use mtime elsewhere) and if that doesn't fail then I read the contents from disk. Something like this:

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

    Other than cacheing the result of fs.stat for the request.url.pathname, is there something that could speed this check up? For example, would it be just as fast to see if fs.readFile errors out instead of the stat? Or using fs.createReadStream instead of fs.readFile? Or could I potentially check for the file using something in child_process.spawn? Basically I just want to make sure I'm not spending any extra time messing w/ fileio when the request should be sent to mongo for data...

    Thanks!