How do I always serve the same file with express?

All we need is an easy explanation of the problem, so here it is.

Is there any way I can always serve the same file?

So, if they go to website.com/ajsdflkasjd it still serves the same file as website.com/asdnw

I would like to do this using express with node.

The file I have is a static html file, not a jade file.

By the way, the reason I’m wanting to do this, in case you were wondering, is I have an angularjs app that handles all the routing for me. So, all I need to do is serve that one page, and it will take care of the rest.

Thanks in advance!

How to solve :

I know you bored from this bug, So we are here to help you! Take a deep breath and look at the explanation of your problem. We have many solutions to this problem, But we recommend you to use the first method because it is tested & true method that will 100% work for you.

Method 1

new answer

const app= require('express')()
     // static file serve
     app.use(express.static(__dirname))
     // not found in static files, so default to index.html
     app.use((req, res) => res.sendFile(`${__dirname}/index.html`))
app.listen(3000)

old answer

var express = require('express');
var bodyParser = require('body-parser')
var path = require('path')
var app = express();
     // url encoding
     app.use(bodyParser.urlencoded({extended:false}));
     // gzip
     // redirect all html requests to `index.html`
     app.use(function (req, res, next) {
         if (path.extname(req.path).length > 0) {
                 // normal static file request
                 next();
             }
         else {
                 // should force return `index.html` for angular.js
                 req.url = '/index.html';
                 next();
             }
     });
     // static file serve
     app.use(express.static(__dirname))
app.listen(3000)

Method 2

Below is what I’m using express with angularjs in my project. It will always send index.html unless the browser requests resource files (images, css, js, etc.) which contains extname.

    var express = require('express');
    var app = express();
    app.configure(function () {
        // url encoding
        app.use(express.urlencoded());
        // gzip
        app.use(express.compress());
        // redirect all html requests to `index.html`
        app.use(function (req, res, next) {
            if (path.extname(req.path).length > 0) {
                // normal static file request
                next();
            }
            else {
                // should force return `index.html` for angular.js
                req.url = '/index.html';
                next();
            }
        });
        // static file serve
        app.use(express.static(__dirname));
    });

Method 3

Basic configuration for Express 4 is:

var express = require('express');

express()
    .get(/.*/, function(req, res) {
        res.sendFile('index.html', {
            root: __dirname
        });
    })
    .listen(8080);

Working example

Those snippets with GZip, BodyParser etc. are pretty cool, but I think over-complicated if you want to just test your single page app. Of course you can add all this “production stuff” when it starts to be needed.

Read more:

Method 4

Here a simple implementation with ExpressJs to create a virtual host and whenever return the index.html

var express = require('express');
var app = express();
var vhost = require('vhost');

// Function to create virtualhost
function createVhost(domain,rootDirectory){
  var exp = express();
  exp.use(express.static(rootDirectory));
  exp.get(/.*/,function(req,res){
    res.sendFile('index.html',{root:rootDirectory});
})
app.use(vhost(domain,exp));
}

// Virtual Host to create
createVhost('example.com','/home//[www]/[example.com]');
createVhost('othersite.com','/home//[www]/[othersite.com]');

// Start Server
app.listen(80,function(){
  console.log('Node server on port 80');
});

Remember:

Add the domains in the “/etc/host” (in linux)

127.0.0.1  example.com
127.0.0.1  othersite.com

And run in the terminal the “app.js” with “sudo” for port 80

~/home/[server]$ sudo node app.js

Method 5

You can do this in both angular as well as node side.

In Node side you can do something like this:

res.sendfile('<ur html file path');

In Angular if you using ui-router you can make use of

$urlRouterProvider.otherwise('/otherwise');

and this otherwise state needs to be defined as well

$stateProvider
.state("otherwise", { url : '/urPage'...})

If you using ngRoute, you can do

 $routeProvider.otherwise({redirectTo: '/urPage'});

UPDATE

Since your routers are not configured to show a default urPage, in the server you can have something as:

var app = express.createServer();
app.get('/urPage',function(req,res){
  res.sendfile('<ur html page>');
});

Note: Use and implement method 1 because this method fully tested our system.
Thank you 🙂

All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

Leave a Reply