menu

Questions & Answers

Express.js 4 routes not matching with router.route

I'm trying to get the hang of router.route in Express 4. The docs make it sound awesome, but it's just not working for me.

If I use the command line tool to make a standard app and then add routes/contacts.js that looks like this:

var express = require('express');
var router = express.Router();

router.route('/:contactid')
  .get(function(req, res) {
    res.send('(get) It worked '+contactid);
  })

module.exports = router;

Then in app.js add:

var contacts = require('./routes/contacts');

...

app.use('/contacts', contacts);

I'd expect http://localhost:8000/contacts/1 to match the route from contacts.js. However, I get an error that essentially indicates it's not matching any routes in contacts.js

Error: Not Found
    at Layer.app.use.res.render.message [as handle] (project1/app.js:31:15)
    at trim_prefix (project1/node_modules/express/lib/router/index.js:226:17)
    at c (project1/node_modules/express/lib/router/index.js:198:9)
    at Function.proto.process_params (project1/node_modules/express/lib/router/index.js:251:12)
    at next (project1/node_modules/express/lib/router/index.js:189:19)
    at next (project1/node_modules/express/lib/router/index.js:150:14)
    at next (project1/node_modules/express/lib/router/index.js:166:38)
    at Function.proto.handle (project1/node_modules/express/lib/router/index.js:234:5)
    at Layer.router (project1/node_modules/express/lib/router/index.js:23:12)
    at trim_prefix (project1/node_modules/express/lib/router/index.js:226:17)

If I add routes using a static prefix, it works as expected:

router.get('/1', function(req, res) {
  res.send('It worked!');
});

// http://localhost:8000/contacts/1 says "It worked!"

Any tips on what I'm doing wrong?

Answers(3) :

Router paths are relative to the mounted path. So your contacts router would instead just be:

router.route('/:contactid')
  .get(function(req, res) {
    res.send('(get) It worked ' + req.params.contactid);
  })
Comments:
2023-01-18 23:10:03
Thanks, sadly, that wasn't it. I threw that in at the last minute to try and test. I've updated the question. By the way, your nick gave me flash backs. ;-)
2023-01-18 23:10:03
Thanks for your help. It turns out that this project was using Express 4.0 so when I created a new project with Express 4.2 it started working. (Also I see you used the req.params.contactid which was helpful)
2023-01-18 23:10:03
are you sure you can do router.route? I thought it was just app.route?

I think this should work (does for me)

In routes/contacts.js

/* Created by matthias on 6/9/14. */
var express = require('express');
var router = express.Router();

router.get('/:contactid', function(req, res) {
        res.send('(get) It worked ' + req.params.contactid);
    });

module.exports = router;

Then in app.js

var contacts = require('./routes/contacts');
var app = express();
app.use('/contacts', contacts);

Works for me: localhost:3000/contacts/:3

Predictably getting: (get) It worked 3

Saved me a lot of headaches !!!. Finally understood that app.js is MOUNTING the route before and the susbsequent middleware needs to be be RELATIVE to that mounting point.

I wish express documentation showed that clearly