3
\$\begingroup\$

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');
\$\endgroup\$
5
\$\begingroup\$

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).

Check out this example.

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.

|improve this answer|||||
\$\endgroup\$
  • \$\begingroup\$ 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. \$\endgroup\$ – GnrlBzik Aug 19 '13 at 15:59
  • 1
    \$\begingroup\$ You can set the directory to anything you like, just make sure it contains only public assets. \$\endgroup\$ – diversario Aug 19 '13 at 19:15
  • \$\begingroup\$ This works great, so i just had to add this before any routes, and then just leave wild card to serve index.html \$\endgroup\$ – GnrlBzik Aug 20 '13 at 19:58
  • 1
    \$\begingroup\$ If the index.html is within your public directory it will be serve as well. You don't need a specific route for it. \$\endgroup\$ – jackdbernier Mar 17 '14 at 14:18
  • \$\begingroup\$ Note that the middleware must come before the wildcard definition in order to work. \$\endgroup\$ – Amin NAIRI Mar 8 '19 at 19:51

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.