Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Fastest way to check for existence of a file in NodeJs

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!

like image 895
Lite Byte Avatar asked Jan 09 '12 01:01

Lite Byte


People also ask

How do you check file exist or not in js?

Description. The exists() method of the File object returns a boolean value based on the existence of the file in which it was invoked. If the file exists, the method returns true. It returns false if the file does not exist.

How do I find a file in node JS?

To find the files that match a pattern using Node. js, install and use the glob module, passing it a pattern as the first parameter and a callback function as the second. The function gets called with a potential error object as the first parameter and the matching files as the second.

How do I validate a path in node JS?

Any Node. Js version. const fs = require("fs"); let path = "/path/to/something"; fs. lstat(path, (err, stats) => { if(err) return console.

Is exist in node JS?

exists() method is used to test whether the given path exists or not in the file system.


2 Answers

var fs = require('fs');  fs.exists(file, function(exists) {   if (exists) {     // serve file   } else {     // mongodb   } }); 
like image 114
fent Avatar answered Oct 09 '22 00:10

fent


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

like image 33
alessioalex Avatar answered Oct 09 '22 00:10

alessioalex