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 = ' + 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.
2 Answers
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.
3Express 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.
//or