120 votes

Passer le contrôle d'itinéraire avec un paramètre optionnel après Root dans express ?

Je travaille sur une application simple de raccourcissement d'url et j'ai les routes express suivantes :

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 souhaite supprimer le /l/ de ma route (pour raccourcir mes url) et rendre le paramètre :key optionnel. Est-ce que c'est la bonne façon de faire ?

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

Je ne sais pas si je dois préciser que mon / est celui qui doit être "voisin". Mais comme mon seul autre itinéraire serait mon poste mis à jour / J'imagine que cela fonctionnera très bien.

242voto

Ernesto Badillo Points 749

Cela fonctionnerait en fonction de ce que fait client.get lorsqu'on lui passe undefined comme premier paramètre.

Une telle mesure serait plus sûre :

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 aucun problème à appeler next() à l'intérieur du callback.

Según cette Les gestionnaires sont invoqués dans l'ordre où ils sont ajoutés, donc tant que votre prochaine route est app.get('/', ...), elle sera appelée s'il n'y a pas de clé.

11voto

Lord Points 2720

Version express :

"dependencies": {
    "body-parser": "^1.19.0",
    "express": "^4.17.1"
  }

Les paramètres optionnels sont très pratiques, vous pouvez les déclarer et les utiliser facilement en utilisant 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);
    }
});

Dans le code ci-dessus lotNo est facultatif. Express le comptera comme optionnel parce qu'après la construction de l'URL, j'ai donné un symbole '?' après batchNo '/:batchNo?'

Maintenant je peux appeler avec seulement categoryId et productId ou avec tous les trois paramètres.

http://127.0.0.1:3000/api/v1/tours/5/10
//or
http://127.0.0.1:3000/api/v1/tours/5/10/8987

enter image description here enter image description here

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X