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.