Przekazywanie kontroli trasy z opcjonalnym parametrem po katalogu głównym w ekspresie?

91

Pracuję nad prostą aplikacją do skracania adresów URL i mam następujące trasy ekspresowe:

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

Chciałbym usunąć /l/z mojej trasy (aby skrócić mój adres URL) i uczynić parametr: key opcjonalnym. Czy byłby to właściwy sposób, aby to zrobić:

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

Nie jestem pewien, czy muszę określić, że moja /trasa ma być „następna”. Ale ponieważ moją jedyną inną trasą byłaby moja zaktualizowana /trasa pocztowa , wyobrażam sobie, że będzie działać dobrze.

Qcom
źródło

Odpowiedzi:

198

To działałoby w zależności od tego, co zrobi client.get, gdy jako pierwszy parametr zostanie przekazany undefined.

Coś takiego byłoby bezpieczniejsze:

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

Nie ma problemu z wywołaniem next () w wywołaniu zwrotnym.

Zgodnie z tym programy obsługi są wywoływane w kolejności ich dodawania, tak długo, jak twoja następna trasa to app.get ('/', ...) będzie wywoływana, jeśli nie ma klucza.

Ernesto Badillo
źródło
Dzięki. Twoja alternatywa jest również doceniana. Niestety mam inny problem, ale myślę, że tak jak wskazałeś, jest to wynik tego, co jest zwracane client.get. Wystąpił cannot call method 'indexOf' of nullbłąd.
Qcom,
Ponadto, możliwe byłoby zadzwonić next()w else{}?
Qcom,
Przepraszamy za komentarz lol. Naprawiono to, ale jest super jank xD
Qcom,
3

Wersja ekspresowa:

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

Opcjonalne parametry są bardzo przydatne, możesz je łatwo zadeklarować i wykorzystać używając 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);
    }
});

W powyższym kodzie partiaNo jest opcjonalna. Express policzy to jako opcjonalne, ponieważ po konstrukcji adresu URL podałem '?' symbol po nr partii „/: nr partii?”

Teraz mogę wywołać tylko z categoryId i productId lub ze wszystkimi trzema parametrami.

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

wprowadź opis obrazu tutaj wprowadź opis obrazu tutaj

Lord
źródło