Passing route control with optional parameter after root in express?

121,490

Solution 1

That would work depending on what client.get does when passed undefined as its first parameter.

Something like this would be safer:

app.get('/:key?', function(req, res, next) {
    var key = req.params.key;
    if (!key) {
        next();
        return;
    }
    client.get(key, function(err, reply) {
        if(client.get(reply)) {
            res.redirect(reply);
        }
        else {
            res.render('index', {
                link: null
            });
        }
    });
});

There's no problem in calling next() inside the callback.

According to this, handlers are invoked in the order that they are added, so as long as your next route is app.get('/', ...) it will be called if there is no key.

Solution 2

Express version:

"dependencies": {
    "body-parser": "^1.19.0",
    "express": "^4.17.1"
  }

Optional parameter are very much handy, you can declare and use them easily using express:

app.get('/api/v1/tours/:cId/:pId/:batchNo?', (req, res)=>{
    console.log("category Id: "+req.params.cId);
    console.log("product ID: "+req.params.pId);
    if (req.params.batchNo){
        console.log("Batch No: "+req.params.batchNo);
    }
});

In the above code batchNo is optional. Express will count it optional because after in URL construction, I gave a '?' symbol after batchNo '/:batchNo?'

Now I can call with only categoryId and productId or with all three-parameter.

http://127.0.0.1:3000/api/v1/tours/5/10
//or
http://127.0.0.1:3000/api/v1/tours/5/10/8987

enter image description here enter image description here

Share:
121,490
Qcom
Author by

Qcom

Updated on May 22, 2020

Comments

  • Qcom
    Qcom almost 4 years

    I'm working on a simple url-shortening app and have the following express routes:

    app.get('/', function(req, res){
      res.render('index', {
        link: null
      });
    });
    
    app.post('/', function(req, res){
      function makeRandom(){
        var text = "";
        var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
    
        for( var i=0; i < 3 /*y u looking at me <33??*/; i++ )
          text += possible.charAt(Math.floor(Math.random() * possible.length));
        return text;
      }
      var url = req.body.user.url;
      var key = makeRandom();
      client.set(key, url);
      var link = 'http://50.22.248.74/l/' + key;
      res.render('index', {
        link: link
      });
      console.log(url);
      console.log(key);
    });
    
    app.get('/l/:key', function(req, res){
      client.get(req.params.key, function(err, reply){
        if(client.get(reply)){
          res.redirect(reply);
        }
        else{
          res.render('index', {
            link: null
          });
        }
      });
    });
    

    I would like to remove the /l/ from my route (to make my url's shorter) and make the :key parameter optional. Would this be the correct way to do this:

    app.get('/:key?', function(req, res, next){
      client.get(req.params.key, function(err, reply){
        if(client.get(reply)){
          res.redirect(reply);
        }
        else{
          next();
        }
      });
    });
    
    app.get('/', function(req, res){
      res.render('index, {
        link: null
      });
    });
    

    Not sure if I need to specify that my / route is the one to be "nexted" to. But since my only other route would be my updated post / route, I would imagine it would work fine.

  • Qcom
    Qcom almost 13 years
    Thanks, man. You're alternative is also appreciated. Sadly I have another issue, but I think like you pointed out it's a result of what is returned by client.get. I'm thrown a cannot call method 'indexOf' of null error.
  • Qcom
    Qcom almost 13 years
    Also, would it be possible to call next() in the else{}?
  • Qcom
    Qcom almost 13 years
    Sorry for the commentfest lol. Got it fixed, but it's super jank xD