javascript working What's the simplest way to serve static files using express?



what are static files (5)

If you want to have a solution without using Express (as you asked for "simple" explicitly), check out the node-static module.

It allows you to serve a folder just like the appropriate middleware for Express, but it also allows you to serve only specific files.

In the simplest case it's just:

var http = require('http'),
    static = require('node-static');

var folder = new(static.Server)('./foo');

http.createServer(function (req, res) {
    req.addListener('end', function () {
        folder.serve(req, res);
    });
}).listen(3000);

If you need some examples, have a look at the GitHub project page, there are several of them.

PS: You can even install node-static globally and use it as a CLI tool by just running it from the shell inside the folder you wish to serve:

$ static

That's it :-)!

PPS: Regarding your original example, it would be way better to use piping with streams here instead of loading all the files in a synchronous way.

I'm using a rather ugly approach:

var app = require('express')(),
    server = require('http').createServer(app),
    fs = require('fs');
server.listen(80);

path = "/Users/my/path/";

var served_files = {};
["myfile1.html","myfile2.html","myfile3.html"].forEach(function(file){
    served_files["/"+file] = fs.readFileSync(path+file,"utf8");
});

app.use(function(req,res){
    if (served_files[req.path]) 
        res.send(files[req.path]);
});

What's the proper way to do it?


I did the below changes to AUTO-INCLUDE the files in the index html. So that when you add a file in the folder it will automatically be picked up from the folder, without you having to include the file in index.html

//// THIS WORKS FOR ME 
///// in app.js or server.js

var app = express();

app.use("/", express.static(__dirname));
var fs = require("fs"),

function getFiles (dir, files_){
    files_ = files_ || [];
    var files = fs.readdirSync(dir);
    for (var i in files){
        var name = dir + '/' + files[i];
        if (fs.statSync(name).isDirectory()){
            getFiles(name, files_);
        } else {
            files_.push(name);
        }
    }
    return files_;
}
//// send the files in js folder as variable/array 
ejs = require('ejs');

res.render('index', {
    'something':'something'...........
    jsfiles: jsfiles,
});

///--------------------------------------------------

///////// in views/index.ejs --- the below code will list the files in index.ejs

<% for(var i=0; i < jsfiles.length; i++) { %>
   <script src="<%= jsfiles[i] %>"></script>
<% } %>

Express has a built in middleware for this. It's part of connect, which express is built on. The middleware itself uses send.

// just add the middleware to your app stack via `use`
app.use(express.static(yourpath));

In answer to your comment, no, there is no way to manually select files. Though by default the middleware will ignore folders prefixed with ., so for example a folder named .hidden would not be served.

To hide files or folders manually, you could insert your own middleware before static to filter out paths before the request reaches it. The following would prevent serving any files from folders named hidden:

app.use(function(req, res, next) {
  if (/\/hidden\/*/.test(req.path)) {
    return res.send(404, "Not Found"); // or 403, etc
  };
  next();
});
app.use(express.static(__dirname+"/public"));

As mentioned in the accepted answer for this question, I'd recommend using http-server.

It can be started via command line without any config

cd /path/to/directory
http-server

Personally I prefer to server files from nginx (I also use it for gzip encoding, caching, SSL handling and load balancing) and node provides just the API. Maybe not the answer you're looking for but it offers interesting choices. Maybe you can have a look at this approach and find that you like it ;)





express