¿Pasando el control de ruta con parámetro opcional después de root en express?

Estoy trabajando en una aplicación simple de acortamiento de URL y tengo las siguientes rutas rápidas:

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 /*yu 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 }); } }); }); 

Me gustaría eliminar el /l/ de mi ruta (para acortar la url) y hacer que el parámetro: key sea opcional. ¿Sería esta la manera correcta de hacer esto?

 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 }); }); 

No estoy seguro de si necesito especificar que mi / ruta es la que debe “estar conectada” a. Pero como mi única otra ruta sería mi publicación / ruta actualizada, me imagino que funcionaría bien.

Eso funcionaría dependiendo de lo que haga client.get cuando se pasa como su primer parámetro indefinido.

Algo como esto sería más seguro:

 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 }); } }); }); 

No hay problema en llamar a next () dentro de la callback.

De acuerdo con esto , los controladores se invocan en el orden en que se agregan, por lo que siempre que su próxima ruta sea app.get (‘/’, …) se llamará si no hay una clave.