Getting Started With Express 4.x – Advanced Routing – Tutorial 6

In this blog post we will see some advanced routing techniques to be used with express

In my previous blog post I discussed basics of routes and how to implement them. In this section we will some more route features

//app.js file
var users = require('./routes/users');
app.use('/users', users);

//users.js file

//this route will be called for all request with /users only
router.get('/', function (req, res) {
    res.send('Route For Users Base URL');

//this route will be called for /users/list
router.get('/list', function (req, res) {
    res.send('List Route');

//this will be called for /list/1  or /list/2
//there is a regex for the parameter to number only
//so for urls like /list/manish  this route won't be called
router.get(/^/list/(d+)$/, function (req, res) {
    res.send('list route for number id ' + req.params[0]);

//this route will be called all urls with /list and the other part will be treated as //request parameter

//e.g  will pass in this route with parameter as manish
//but url won't match this
router.get('/list/:id', function (req, res) {
    res.send('List Route For ID ' + req.param('id'));

//this is called when a form is submitted on /users/list url'/list', function (req, res) {
    var post = JSON.stringify(req.body);
    res.send('Route For Post ' + post);

//this is to perform a 301 redirect
router.get('/list/users/access', function (req, res) {
    res.redirect(301, '/list/access');
router.get('/list/access', function (req, res) {
    res.send('Access Page After Redirect');

Using route.param for validation per-processing

Another extension of routes is to use the param() function to perform some validaion or per-processing logic.
This can be used to load objects, validations etc.

router.param('id', function (req, res, next, id) {
    if (id % 2 == 0) {
        next(new Error('Only Odd Values Allowed'));
    } else {
        req.is_valid = 1;

router.get('/list/:id', function (req, res) {
    //param is called for this as well only once
    res.send('List Route For ID ' + req.param('id'));

router.get('/list/:id/:page', function (req, res) {
    //param is called for this as well only once
    res.send('List Route For ID ' + req.param('id') + " page " + req.param('page') + ' Is valid request ' + req.is_valid);