Organize routes in Node.js

NilColor picture NilColor · Jan 5, 2011 · Viewed 70.4k times · Source

I start to look at Node.js. Also I'm using Express. And I have a question - how can I organize web application routes? All examples just put all this app.get/post/put() handlers in app.js and it works just fine. This is good but if I have something more than a simple HW Blog? Is it possible to do something like this:

var app = express.createServer();
app.get( '/module-a/*', require('./module-a').urls );
app.get( '/module-b/*', require('./module-b').urls );

and

// file: module-a.js
urls.get('/:id', function(req, res){...}); // <- assuming this is handler for /module-a/1

In other words - I'd like something like Django's URLConf but in Node.js.

Answer

Vegar picture Vegar · Nov 28, 2012

I found a short example in ´Smashing Node.js: JavaScript Everywhere´ that I really liked.

By defining module-a and module-b as its own express applications, you can mount them into the main application as you like by using connects app.use( ) :

module-a.js

module.exports = function(){
  var express = require('express');
  var app = express();

  app.get('/:id', function(req, res){...});

  return app;
}();

module-b.js

module.exports = function(){
  var express = require('express');
  var app = express();

  app.get('/:id', function(req, res){...});

  return app;
}();

app.js

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

app.configure(..);

app.get('/', ....)
app.use('/module-a', require('./module-a'));    
app.use('/where/ever', require('./module-b'));    

app.listen(3000);

This would give you the routes

localhost:3000/
localhost:3000/module-a/:id
localhost:3000/where/ever/:id