web-dev-qa-db-fra.com

Passer le contrôle de route avec le paramètre facultatif après la racine dans express?

Je travaille sur une application de raccourcissement d'URL simple et ai les itinéraires express suivants:

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

Je voudrais enlever le /l/ de ma route (pour raccourcir mon URL) et rendre le paramètre: key facultatif. Serait-ce la bonne façon de faire ceci:

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

Pas sûr de devoir préciser que mon / _ route est celle à suivre. Mais puisque mon seul autre itinéraire serait mon message mis à jour / _ route, j'imagine que cela fonctionnerait bien.

71
Qcom

Cela fonctionnerait en fonction de ce que fait client.get lorsqu'il est transmis en tant que premier paramètre indéfini.

Quelque chose comme ça serait plus sûr:

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

Il n'y a pas de problème à appeler next () dans le rappel.

Selon this , les gestionnaires sont appelés dans l'ordre dans lequel ils ont été ajoutés. Ainsi, tant que votre prochaine route est app.get ('/', ...), elle sera appelée s'il n'y a pas clé.

159
Ernesto Badillo