MattDionis MattDionis - 1 year ago 48
Node.js Question

How to correctly use Express 4 multiple routers

I'm attempting to use the Express 4 Router to use a different router based on the path. I want all

routes handled by
, and every other route handled by
. The below setup serves me all the
routes correctly, but seems to ignore
as I get a 'Cannot GET...' message each time I test those endpoints.


var version1 = require('./routes/vers1');
var version2 = require('./routes/vers2');

module.exports = function(app) {

app.all('/api/v2/*', version2);

app.all('/*', version1);



Method routes (.get, .post, and of course .all) are terminal. This is why you can use wildcards with them as well. .use is not terminal and doesn't allow wildcards -- it acts as a prefix. This is an implementation choice of express. Use .use without wildcards.

The fact that app.use("/*", version1) works is purely incidental. This will match any route and fall through to version1[method](path). Since there is no prefix to strip, if the request route matches path, express will consider this a match and serve that route.

Use .use.