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!
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.
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.
Any Node. Js version. const fs = require("fs"); let path = "/path/to/something"; fs. lstat(path, (err, stats) => { if(err) return console.
exists() method is used to test whether the given path exists or not in the file system.
var fs = require('fs'); fs.exists(file, function(exists) { if (exists) { // serve file } else { // mongodb } });
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With