Passing route control with optional parameter after root in express?
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
Qcom
Updated on May 22, 2020Comments
-
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 almost 13 yearsThanks, 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 acannot call method 'indexOf' of null
error. -
Qcom almost 13 yearsAlso, would it be possible to call
next()
in theelse{}
? -
Qcom almost 13 yearsSorry for the commentfest lol. Got it fixed, but it's super jank xD