Passer le contrôle d'itinéraire avec un paramètre facultatif après la racine dans express?

87

Je travaille sur une simple application de raccourcissement d'URL et j'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 supprimer le /l/de mon itinéraire (pour raccourcir mon URL) et rendre le paramètre: key facultatif. Serait-ce la bonne façon de procéder:

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 j'ai besoin de spécifier que mon /itinéraire est celui à "côté". Mais comme mon seul autre itinéraire serait mon /itinéraire de publication mis à jour , j'imagine que cela fonctionnerait bien.

Qcom
la source

Réponses:

193

Cela fonctionnerait en fonction de ce que fait client.get lorsqu'il est passé undefined comme premier paramètre.

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 aucun problème à appeler next () dans le rappel.

Selon cela , les gestionnaires sont appelés dans l'ordre dans lequel ils sont ajoutés, donc tant que votre prochaine route est app.get ('/', ...), il sera appelé s'il n'y a pas de clé.

Ernesto Badillo
la source
Merci mec. Votre alternative est également appréciée. Malheureusement, j'ai un autre problème, mais je pense que, comme vous l'avez souligné, c'est le résultat de ce qui est retourné client.get. J'ai jeté une cannot call method 'indexOf' of nullerreur.
Qcom
Aussi, serait-il possible d'appeler next()le else{}?
Qcom
Désolé pour le commentfest lol. Je l'ai réparé, mais c'est super jank xD
Qcom
1

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 lot de code ci-dessus est facultatif. Express le comptera facultatif car 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 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

entrez la description de l'image ici entrez la description de l'image ici

Seigneur
la source