在root后面用可选parameter passing路由控制

我正在做一个简单的url缩短应用程序,并有以下快递路线:

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

我想删除/l/从我的路线(使我的url更短),并使:key参数可选。 这是否是正确的方法来做到这一点:

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

不知道是否需要指定我的/路由是“nexted”。 但因为我唯一的其他路线是我的更新后的路线,我会想象它会正常工作。

这将取决于什么client.get时传递undefined作为其第一个参数。

像这样的东西会更安全:

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

在callback中调用next()没有问题。

据此,处理程序按照它们被添加的顺序被调用,所以只要你的下一个路由是app.get('/',…),它将在没有密钥的情况下被调用。