Neoclassical Piano Montage


    0.0.4 • Public • Published

    Connectington Build Status

    Connectington is a trie-based URL and method router for Node.js based on routington. It was created out of frustration with Express' simplistic, method-first routing and can be used as a drop-in replacement. For more information on its motivations, read about The Imperfections of Express.

    When should you use this?

    • Want your server to conform to HTTP specs
    • Want to decouple your app away from Connect/Express
    • Prefer a more modular routing framework
    • Prefer explicit routing
      • Wildcards are not supported
      • Only a single route will be matched, otherwise it will fall through
    • You repeat a lot of route definitions, ie looping through routes to add handlers
    • You want structure to your URL routes - routes are stored in a branch tree


    • Supports the OPTIONS method automatically.
    • Supports 405 Method Not Allowed automatically.
    • Supports 501 Not Implemented automatically, assuming you use the middleware.
    • Allows you to "define" middleware stacks for easy re-use.
    • Faster (insignificantly) as it uses string matching instead of regular expression matching whenever possible.


    Mounting to Connect/Express

    var connectington = require('connectington')
    var router = connectington()

    To mount the middleware:

    var app = express()
    // static stuff
    // cookie stuff
    // session stuff
    // 404 handler
    // error handler


    If you're not using Express or Connect, it will still work:

    var implementedMethods = router.implementedMethods()
    var middleware = router.middleware()
    // ...
    // Define routes
    // ...
    http.createServer().on('request', function (req, res) {
      implementedMethods(req, res, function (err) {
        if (err) {
          res.status = err.status
        middleware(function (req, res, next) {
          if (err) {
            res.status = err.status
          // If this point is reached,
          // no route has been matched
          res.status = 404
          res.end('Not Found')

    Defining middleware

    router.define('compress', connect.compress())
    router.define('session', [

    You will define middleware stacks which will then be referrable by name. For example:

    router.get('/', 'compress', 'session')

    is equivalent to all of the following:

    router.get('/', connect.compress(), connect.cookieParser(), connect.cookieSession())
    router.get('/', connect.compress(), [
    router.get('/', [

    The idea is that you turn your middleware stacks into legos. You can define them early in your app, then re-use them throughout your routes without require()ing each of them. It will also make your routes much more readable as you can make it look like this:

      'cache if visitor',
      'accept html only',
      'retrieve session',
    function handler(req, res) {

    Defining routes

    For information on how the routing strings actually work, view routington's documentation.

    There are two ways to create a route. The first is the usual Express way:

    router.get('/things', 'compress', 'session', handler, ...)'/things', 'compress', 'session', handler, ...)
    router.put('/things', 'compress', 'session', handler, ...)

    The other is by defining a route, then adding stacks based on the method:

    .get('compress', 'session', handler, ...)
    .post('compress', 'session', handler, ...)
    .put('compress', 'session', handler, ...)

    In both versions, you can define multiple routes at the same time using an array:

    .get('compress', 'session', handler, ...)
    .post('compress', 'session', handler, ...)
    .put('compress', 'session', handler, ...)

    Parameter matching

    If you define a route like so:

    router.get('/thing/:id', handler)

    You can retrieve the value of id just like in Express:

    function handler(req, res, next) { =

    Accessing the trie

    The trie, specifically the routington instance, is accessible at router.trie. You can manipulate it however you'd like. View it's documentation for more information.

    Unsupported Express features

    • Wildcard routes are not supported. The purpose of this router is to make it easier for you to be explicit.
    • app.all is not supported. Simply define a stack and use it in every method.
    • Regular expressions are not supported as input arguments.



    © Jonathan Ong 2013





    npm i connectington

    DownloadsWeekly Downloads






    Last publish


    • jongleberry