एक्सप्रेस में रूट के बाद वैकल्पिक पैरामीटर के साथ मार्ग नियंत्रण?


87

मैं एक सरल url-shortening ऐप पर काम कर रहा हूं और निम्नलिखित एक्सप्रेस मार्ग हैं:

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

मैं /l/अपने मार्ग से (अपने url को छोटा बनाने के लिए) को हटाना चाहता हूं: मुख्य पैरामीटर को वैकल्पिक बनाना। क्या ऐसा करने का सही तरीका होगा:

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

यह निश्चित नहीं है कि क्या मुझे यह निर्दिष्ट करने की आवश्यकता है कि मेरा /मार्ग "अगला" है। लेकिन चूंकि मेरा एकमात्र दूसरा मार्ग मेरा अपडेटेड पोस्ट /रूट होगा, इसलिए मुझे लगता है कि यह ठीक काम करेगा।

जवाबों:


193

यह उस क्लाइंट के आधार पर काम करेगा, जो क्लाइंट को भूल जाता है जब वह पहले पैरामीटर के रूप में अपरिभाषित हो जाता है।

कुछ इस तरह से सुरक्षित होगा:

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

कॉलबैक के अंदर () कॉल करने में कोई समस्या नहीं है।

इसके अनुसार , हैंडलर को इस क्रम में लगाया जाता है कि उन्हें जोड़ा जाता है, इसलिए जब तक आपका अगला मार्ग app.get ('/', ...) है तब तक इसे बुलाया जाएगा यदि कोई कुंजी नहीं है।


धन्यवाद दोस्त। आप वैकल्पिक हैं भी सराहना की है। अफसोस की बात है कि मेरे पास एक और मुद्दा है, लेकिन मुझे लगता है कि आपने बताया कि यह उसी का नतीजा है जो इसके द्वारा लौटाया गया है client.get। मुझे एक cannot call method 'indexOf' of nullत्रुटि दी गई है।
Qcom

इसके अलावा, यह कॉल करने के लिए संभव हो जाएगा next()में else{}?
Qcom

टिप्पणी के लिए खेद है lol। समझ गया, लेकिन यह सुपर jank xD है
Qcom

1

एक्सप्रेस संस्करण:

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

वैकल्पिक पैरामीटर बहुत आसान हैं, आप एक्सप्रेस का उपयोग करके आसानी से घोषणा और उपयोग कर सकते हैं:

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

उपरोक्त कोड में बैचो वैकल्पिक है। एक्सप्रेस इसे वैकल्पिक रूप से गिना जाएगा क्योंकि URL निर्माण के बाद, मैंने '?' बैच के बाद प्रतीक '/: बैच नहीं?'

अब मैं केवल कैटेगरीआईड और प्रोडक्टआईडी या तीनों मापदंडों के साथ कॉल कर सकता हूं।

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

यहाँ छवि विवरण दर्ज करें यहाँ छवि विवरण दर्ज करें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.