Routensteuerung mit optionalem Parameter nach root in express übergeben?

86

Ich arbeite an einer einfachen App zur URL-Verkürzung und habe die folgenden Express-Routen:

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

Ich möchte das /l/von meiner Route entfernen (um meine URL zu verkürzen) und den Parameter: key optional machen. Wäre dies der richtige Weg, dies zu tun:

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

Ich bin mir nicht sicher, ob ich angeben muss, dass meine /Route diejenige ist, der ich "folgen" möchte. Aber da meine einzige andere Route meine aktualisierte /Postroute wäre, würde ich mir vorstellen, dass sie gut funktionieren würde.

Qcom
quelle

Antworten:

189

Dies würde abhängig davon funktionieren, was client.get tut, wenn es als erster Parameter undefiniert übergeben wird.

So etwas wäre sicherer:

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

Es ist kein Problem, next () innerhalb des Rückrufs aufzurufen.

Nach diesem werden Handler in der Reihenfolge aufgerufen , dass sie hinzugefügt werden, so lange , wie Sie Ihre nächste Route app.get ist ( ‚/‘, ...) es , wenn kein Schlüssel ist es aufgerufen wird.

Ernesto Badillo
quelle
Danke, Mann. Ihre Alternative wird auch geschätzt. Leider habe ich ein anderes Problem, aber ich denke, wie Sie darauf hingewiesen haben, ist es ein Ergebnis dessen, was zurückgegeben wird client.get. Ich habe einen cannot call method 'indexOf' of nullFehler geworfen .
Qcom
Auch wäre es möglich, nennen next()in der else{}?
Qcom
Entschuldigung für das Kommentarfest lol. Habe es behoben, aber es ist super jank xD
Qcom
1

Express-Version:

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

Optionale Parameter sind sehr praktisch. Sie können sie einfach mit express deklarieren und verwenden:

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

Im obigen Code ist batchNo optional. Express zählt es als optional, da ich nach der URL-Erstellung ein '?' Symbol nach batchNo '/: batchNo?'

Jetzt kann ich nur mit categoryId und productId oder mit allen drei Parametern aufrufen.

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

Geben Sie hier die Bildbeschreibung ein Geben Sie hier die Bildbeschreibung ein

Herr
quelle