javascript - working - what are static files




What's the simplest way to serve static files using express? (4)

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?


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

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

If you want a really simple way then I would like to show you my module (it is not only for static files) simpleS, install it using npm install simples.

Put all your files in a folder, for example files.

Here is the magic:

var simples = require('simples');

var server = simples(80);

server.serve('files');

/* if you want to catch the acces to a folder and to do something, try this:
server.serve('files', function (connection, files) {
    // Your application logic
    // For example show the files of the folder
});
*/

You don't need to care about the content type of the files, it will detect it automatically from file extension


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.





express