Skip to content

Instantly share code, notes, and snippets.

@tj
Created August 24, 2011 00:21
Show Gist options
  • Star 18 You must be signed in to star a gist
  • Fork 6 You must be signed in to fork a gist
  • Save tj/1166989 to your computer and use it in GitHub Desktop.
Save tj/1166989 to your computer and use it in GitHub Desktop.
example of backbone-style routing with Express
app.get('/help', function(req, res){
res.send('some help');
});
app.get('/search/:query/p:page', function(req, res){
var query = req.params.query
, page = req.params.page;
res.send('search "' + query + '", page ' + (page || 1));
});
function Router(obj) {
this.methods = obj;
this.route(obj.routes);
}
Router.prototype.route = function(obj){
var self = this
, routes = Object.keys(obj);
Object.keys(obj).forEach(function(route){
var parts = route.split(' ')
, method = parts.shift().toLowerCase()
, path = parts.shift()
, fn = self.methods[obj[route]];
app[method]('/' + path, function(req, res, next){
var args = req.route.keys.map(function(key){
return req.params[key.name];
});
fn.apply(res, args);
});
});
};
Router.extend = function(obj){
return new Router(obj);
};
// GET /help
// GET /search/foobar
// GET /search/foobar/p2
var router = Router.extend({
routes: {
'GET help': 'help'
, 'GET search/:query': 'search'
, 'GET search/:query/p:page': 'search'
},
help: function(){
this.send('some help');
},
search: function(query, page){
this.send('search "' + query + '", page ' + (page || 1));
}
});
@rainerborene
Copy link

This is really cool.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment