Getting Backbone and Express routes playing nicely

I have an express app serving the following routes

/login
/signup
/
/app

And I want my backbone application to manage the following routes

/app/overview/:company_id/:date
/app/rooms/:company_id/:date

Anyways, express serves up the base app.jade at /app and then is supposed to hand off navigation to backbone but is instead of course intercepting and giving me a route not found.

How do I do this? given someone might copy and paste a url like

/app/overview/3/2012-12-12

You possibly have two related problems: you are using push state client-side (i.e. using "real" URLs, not hash fragments such as /app#overview) but (maybe) have not enabled push state in Backbone, and your express configuration does not respond to those client-side routes.

Using push state URLs, you still have to handle those URLs server-side, since the user may visit your website using these direct "client-side" URLs (something that doesn't happen with hash fragments, since the hash part is never sent to the server).

So to fix the server-side handling, express allows using regular expressions as routes, so instead of:

app.get('/app', function(req, res) {
  // Render the app...
});

You could do (see here):

// The regexp could be a little more restrictive, obviously, but you get the point...
app.get(/^\/app(\/\w+)*$/, function(req, res) {
  // Render the app...
});

So that no matter which /app/* URL is used as entry-point to your web app, it gets served the necessary content.

Then in your Backbone initialization client-side, you should start the history management using Backbone.history.start({pushState: true}) so that push state is enabled. See here.

You can simply serve the app, leaving the route untouched.

// given your app serves routes.index
app.get('/app/overview/:company_id/:date', routes.index);
app.get('/app/rooms/:company_id/:date', routes.index);
// ... and so on

This way the app will be served normally, allowing backbone to handle the route.