# Serving static assets through wildcard rule

I wrote this as a way to deliver static portion of the app. I'm wondering if there is a better way to write this, as I am new to Express.

The goal is to let a single-page app to handle routing as needed. There is an API layer of this app that is defined under the /api/ route namespace.

I wanted to note that all assets are served from /app folder and are not public. I can adjust that, but as of now, that's the folder structure. /app is a compilation destination. root folder contains server.js where the below code resides and contains app/ and src/ folders, as well as server/ folder that contains API related stuff.

var express = require('express');
var http = require('http');
var path = require('path');
var app = express();

require('./express/api')(app);

app.get("/css/*",function(req,res){
res.sendfile('app'+req.path);
});
app.get("/js/*",function(req,res){
res.sendfile('app'+req.path);
});
app.get("/img/*",function(req,res){
res.sendfile('app'+req.path);
});
app.get("/pages/*",function(req,res){
res.sendfile('app'+req.path);
});
app.get('*',function(req,res){
res.sendfile('app/index.html');
});

app.listen(3000);
console.log('Listening on port 3000');


There is a better way.

If you wish to serve static files with express - it comes bundled with static middleware. To use it, you simply add this line before your routes:

app.use(express.static(__dirname + '/public'));


This may require slight adjustment to your paths but it replaces all those manual routes and is more efficient (caching, expiration etc).

I would, however, suggest that you use something like nginx for your static assets since it's typically more robust and it'll free resources from your node server.

• thanks @diversario, this would require me to adjust my build process, is there a way to set the public directory to something else. I will look at it my self, just maybe you know. – GnrlBzik Aug 19 '13 at 15:59
• You can set the directory to anything you like, just make sure it contains only public assets. – diversario Aug 19 '13 at 19:15
• This works great, so i just had to add this before any routes, and then just leave wild card to serve index.html – GnrlBzik Aug 20 '13 at 19:58
• If the index.html is within your public directory it will be serve as well. You don't need a specific route for it. – jackdbernier Mar 17 '14 at 14:18
• Note that the middleware must come before the wildcard definition in order to work. – Amin NAIRI Mar 8 '19 at 19:51