Skip to content

BarkingMouseStudio/express-subdomain

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

48 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Build Status Coverage Status

#express-subdomain

Is simply express middleware. In the examples below I am using Express v4.x.

##Install

With npm, saving it as a dependency.

npm i express-subdomain --save

##Simple usage

Let's say you want to provide a RESTful API via the url http://api.example.com

####Express boilerplate code:

var subdomain = require('express-subdomain');
var express = require('express');
var app = express();

// *** Code examples below go here! ***

// example.com
app.get('/', function(req, res) {
    res.send('Homepage');
});

####API Router

var router = express.Router();

//api specific routes
router.get('/', function(req, res) {
    res.send('Welcome to our API!');
});

router.get('/users', function(req, res) {
    res.json([
        { name: "Brian" }
    ]);
});

Now register the subdomain middleware:

app.use(subdomain('api', router));
app.listen(3000);

The API is alive:

http://api.example.com/ --> "Welcome to our API!"

http://api.example.com/users --> "[{"name":"Brian"}]"

##Multi-level Subdomains

app.use(subdomain('v1.api', router)); //using the same router

http://v1.api.example.com/ --> "Welcome to our API!"

http://v1.api.example.com/users --> "[{"name":"Brian"}]"

###Wildcards

Say you wanted to ensure that the user has an API key before getting access to it... and this is across all versions.

Note: In the example below, the passed function to subdomain can be just a pure piece of middleware.

var checkUser = subdomain('*.api', function(req, res, next) {
    if(!req.session.user.valid) {
        return res.send('Permission denied.');
    }
    next();
});

app.use(checkUser);

This can be used in tandem with the examples above.

Note: The order in which the calls to app.use() is very important. Read more about it here.

app.use(checkUser);
app.use(subdomain('v1.api', router));

##Divide and Conquer

The subdomains can also be chained, for example to achieve the same behaviour as above:

var router = express.Router(); //main api router
var v1Routes = express.Router(); 
var v2Routes = express.Router();

v1Routes.get('/', function(req, res) {
    res.send('API - version 1');
});
v2Routes.get('/', function(req, res) {
    res.send('API - version 2');
});

var checkUser = function(req, res, next) {
    if(!req.session.user.valid) {
        return res.send('Permission denied.');
    }
    next();
};

//the api middleware flow
router.use(checkUser);
router.use(subdomain('*.v1', v1Routes));
router.use(subdomain('*.v2', v2Routes));

//basic routing..
router.get('/', function(req, res) {
    res.send('Welcome to the API!');
});

//attach the api
app.use(subdomain('api', router));
app.listen(3000);

####Invalid user

http://api.example.com/ --> Permission denied.

####Valid user

http://api.example.com/ --> Welcome to the API!

http://v1.api.example.com/ --> API - version 1

http://abc.v1.api.example.com/ --> API - version 1

http://v2.api.example.com/ --> API - version 2

http://abc.v2.api.example.com/ --> API - version 2

##Need in-depth examples?

Have a look at the tests!

About

Super simple subdomain middleware for expressjs

Resources

Stars

Watchers

Forks

Packages

No packages published

Languages

  • JavaScript 99.0%
  • Shell 1.0%