Ekspres kökünden sonra isteğe bağlı parametre ile yol kontrolünü geçmek?


91

Basit bir url kısaltma uygulaması üzerinde çalışıyorum ve aşağıdaki hızlı rotalara sahibim:

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

Yolumdan kaldırmak /l/(url'mi kısaltmak için) ve: key parametresini isteğe bağlı yapmak istiyorum. Bunu yapmanın doğru yolu bu mu?

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

/Rotamın "sonraki" rotam olduğunu belirtmem gerekip gerekmediğinden emin değilim . Ancak diğer tek rotam güncellenmiş gönderi /rotam olacağından, iyi çalışacağını hayal ederdim.

Yanıtlar:


198

Bu, client.get'in ilk parametresi olarak undefined geçirildiğinde ne yaptığına bağlı olarak çalışır.

Bunun gibi bir şey daha güvenli olabilir:

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

Geri aramada next () 'i aramada sorun yok.

Göre bu , işleyicileri yani sürece bir sonraki rota hiçbir anahtar varsa app.get ( '/', ...) o çağrılacak olduğu gibi, bunlar ilave sırayla çağrılır.


Teşekkürler dostum. Senin alternatifin de takdir ediliyor. Maalesef başka bir sorunum var, ama sizin belirttiğiniz gibi bunun geri dönen şeyin bir sonucu olduğunu düşünüyorum client.get. Bir cannot call method 'indexOf' of nullhata yaptım .
Qcom

Ayrıca, next()içinde aramak mümkün olur else{}mu?
Qcom

Commentfest lol için özür dilerim. Düzeltildi, ancak süper kötü xD
Qcom

3

Hızlı sürüm:

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

İsteğe bağlı parametreler çok kullanışlıdır, bunları ifade kullanarak kolayca açıklayabilir ve kullanabilirsiniz:

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

Yukarıdaki kodda batchNo isteğe bağlıdır. Ekspres bunu isteğe bağlı olarak sayacak çünkü URL oluşturulduktan sonra bir '?' batchNo '/: batchNo?'

Artık yalnızca categoryId ve productId ile veya üç parametrenin tümü ile çağrı yapabilirim.

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

görüntü açıklamasını buraya girin görüntü açıklamasını buraya girin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.