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));
}
});
@tj
Copy link
Author

tj commented Aug 24, 2011

this is a really quick mockup of how you could utilize higher level routing, since sometimes people seem to forget that you can build on basic routes, while of course still retaining the lower level flexibility app.get() etc

@ded
Copy link

ded commented Aug 24, 2011

right on

@DarkSmith
Copy link

Is this going to be included in express on in a separate module ?

@tj
Copy link
Author

tj commented Aug 24, 2011

@DarkSmith didn't plan on either but it could easily be an extension like express-resource

@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