Passaggio del controllo del percorso con un parametro opzionale dopo la radice in express?


91

Sto lavorando a una semplice app per accorciare gli URL e ho i seguenti percorsi rapidi:

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

Vorrei rimuovere il /l/dal mio percorso (per rendere il mio URL più breve) e rendere facoltativo il parametro: key. Sarebbe questo il modo corretto per farlo:

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

Non sono sicuro se devo specificare che il mio /percorso è quello a cui essere "vicino". Ma poiché il mio unico altro percorso sarebbe il mio /percorso di posta aggiornato , immagino che funzionerebbe bene.

Risposte:


198

Ciò funzionerebbe a seconda di ciò che client.get fa quando viene passato undefined come primo parametro.

Qualcosa di simile sarebbe più sicuro:

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

Non ci sono problemi a chiamare next () all'interno del callback.

In base a ciò , i gestori vengono richiamati nell'ordine in cui sono stati aggiunti, quindi finché il tuo prossimo percorso è app.get ('/', ...) verrà chiamato se non c'è la chiave.


Grazie uomo. Anche la tua alternativa è apprezzata. Purtroppo ho un altro problema, ma penso che come hai sottolineato sia il risultato di ciò che viene restituito da client.get. Ho ricevuto un cannot call method 'indexOf' of nullerrore.
— Qcom

Inoltre, sarebbe possibile chiamare next()in else{}?
— Qcom

Scusa per il commentfest lol. Ho risolto, ma è super jank xD
— Qcom

3

Versione Express:

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

I parametri opzionali sono molto utili, puoi dichiararli e usarli facilmente usando 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);
    }
});

Nel codice sopra batchNo è opzionale. Express conterà come facoltativo perché dopo nella costruzione dell'URL, ho dato un "?" simbolo dopo batchNo "/: batchNo?"

Ora posso chiamare solo con categoryId e productId o con tutti e tre i parametri.

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

inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.