Skip to content
Create a gist now

Instantly share code, notes, and snippets.

Embed URL


Subversion checkout URL

You can clone with
Download ZIP
Node.JS static file web server. Put it in your path to fire up servers in any directory, takes an optional port argument.
var http = require("http"),
url = require("url"),
path = require("path"),
fs = require("fs")
port = process.argv[2] || 8888;
http.createServer(function(request, response) {
var uri = url.parse(request.url).pathname
, filename = path.join(process.cwd(), uri);
path.exists(filename, function(exists) {
if(!exists) {
response.writeHead(404, {"Content-Type": "text/plain"});
response.write("404 Not Found\n");
if (fs.statSync(filename).isDirectory()) filename += '/index.html';
fs.readFile(filename, "binary", function(err, file) {
if(err) {
response.writeHead(500, {"Content-Type": "text/plain"});
response.write(err + "\n");
response.write(file, "binary");
}).listen(parseInt(port, 10));
console.log("Static file server running at\n => http://localhost:" + port + "/\nCTRL + C to shutdown");

Thank you!


likewise on the thank you!


Thank you for making this available


Thank you!


This doesn't set the mim type. You can use the mime module like this


Thanks a lot!


thanks XD


Great stuff, exactly what I was looking for.


You may use the non-static module as well


Thanks for this! :)


Careful! This code is vulnerable to a directory traversal attack.


I'm just using it for a local web preview anyway


I'm just getting started with node.js and backbone.js and this has been perfect for setting up demo apps quickly.


I needed to put up a holding page for a website I was building and this was an awesome lightweight solution... Thanks!


Just what I was looking for. Danke Shoen!


Consider also python -m SimpleHTTPServer 888 or twistd -n web -p 8888 --path .. The former is installed pretty much anywhere where there's Python, the latter is better performing and is bundled with many distributions including Mac OSX - no need for pasting/downloading another file.




So good !




Thank you, this rocks!




path.exists should be changed to fs.exists


Nice! I typically use

python -m SimpleHTTPServer

to serve the cwd.


Brilliant solution!


fantastic.... love this!


nice, this totally is the javascript spirit of the python SimpleHTTPServer


I dumped in piping because I was using it to transfer larger files. May be slow... gist


Great example to understand


Wow the first one that works for me thank very much for this code!
Well, it works everywhere except in...surprise: IE11 & <


Quick question: does this script ensure that data in higher-level directories is inaccessible via http requests? E.g. I can't request /../../../../.ssh/id_rsa (just an example) and have it send that data to me?


@dylantack @Ajedi32 I was concerned about this as well, but after some quick testing it appears that url.parse is sanitizing the requested path. For example, if this node server is running from /home and you try visiting it resolves to /home/.ssh/id_rsa.




Great work, Thanks


FYI, if you're serving media files you might want to look at the send module. It will handle large files better, and Partial Content requests (important for HTML5 video).


To be sure to avoid transversal directory attacks without relying on url.parse, one could also do

var cwd = process.cwd();
http.createServer (function (req, res) {
    var uri = url.parse(req.url).pathname,
        filename = path.join(cwd, uri);
    if (filename.indexOf(cwd) !== 0)
        // Abort

Also, I would use filename = path.join(filename, 'index.html') instead of filename += '/index.html'. / isn't necessarily the OS separator, or we wouldn't use a path module.


muy bueno, gracias


thanks a lot dude


Many thanks.

Shouldn't the method "exists" be used with fs instead of path?
On line 12 of the code we have:

path.exists(filename, function(exists) {...});

This gave me an error and it seemed fine after I replaced it with:

fs.exists(filename, function(exists) {...});

Agree with the last comment, replacing path.exist with fs.exist fixed an error that I did not fully understand. Otherwise, fantastic solution, perfect for beginners :)


yes thanks brandt1871 path.exists is now called fs.exists


Same issue here, path.exists is now called fs.exists

Please fix for future generations :)




Please, include package.json so that we could npm install. Thanks!


You saved my day brotha.. Thanks :) ~

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Something went wrong with that request. Please try again.