express-route-dispatcher

Route dispatcher for Express

express-route-dispatcher

Micro routing framework on top of the Express framework.

[2014-01-28] Now with generators/yield support

ERD provides a way of decoupling your route definition and the actual implementation by following a convention based approach. Furthermore it allows you to add "before" hooks to your route processing.

The routes are mapped to controllers/actions (files/methods).

See the examples for live action.

$ npm install express express-route-dispatcher

ERD assumes some defaults when not explicitely configured. For example it expects the controllers to be in a directory called "./controllers".

Example directory layout ./server.js ./controllers/basic.js ./controllers/auth.js

    var express = require('express');
    var dispatcher = require('express-route-dispatcher');
    var app = express();
 
    // create the routes 
    dispatcher.map(function() {
        // route, controller, method 
        this.get ('/basic/hello', 'basic', 'hello');
        this.post('/basic/concat/:a/:b', 'basic', 'concat');
        this.get ('/version', 'basic', 'version');
    });
 
    // apply the routing configuration 
    dispatcher.finish(app);
    module.exports = {
        beforeEach : function(reqresnext) {
            if(doSomeImportantCheck()) return next();
            
            res.send('Important check failed'); 
        }
        hello : function(reqres) {
            res.send('Hello my friend');
        },
 
        concat : function(reqres) {
            res.send(req.params.+ req.params.b);
        },
 
        versionfunction*(reqres) {
            try {
                var data = yield somePromise();
                var version = yield anotherPromise(data);
                res.send(version);              }
            catch(err) {
                res.send(500, 'Something went wrong while getting the version!');           }
        }
    }

ERD supports two options

  • path (where to find the controllers)
  • parseControllerName (allows you to adjust the lookup algorithm)

Example directory layout ./server.js ./api/basicController.js

    // ... 
 
    dispatcher.configure({
        path: 'api',
        parseControllerNamefunction(name) {
            return name.toLowerCase() + 'Controller';
        }
    });
 
    dispatcher.map(function() {
        this.get('/basic/hello', 'basic', 'hello');
    });
 
    dispatcher.finish(app);

ERD supports nested routing which might be useful for authentication checks and alike. All handlers inside the new map() will run through the before check first.

    // ... 
 
    dispatcher.map(function() {
        this.get('/version', 'basic', 'version');
        this.get('/auth/login', 'auth', 'login');
        this.before(function(reqresnext) {
            if (numberCrunch.wobble(req) > 18) {
                return res.send("no can do sir");
            }
            return next();
        }).map(function() {
            this.get('/auth/logout', 'auth', 'logout');
            this.get('/word/domination/plan', 'internal', 'plan');
        });
    });