ผ่านการควบคุมเส้นทางด้วยพารามิเตอร์ทางเลือกหลังจากรูทใน express?


91

ฉันกำลังทำงานกับแอพย่อ URL แบบง่ายๆและมีเส้นทางด่วนดังต่อไปนี้:

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

ไม่แน่ใจว่าต้องระบุหรือไม่ว่า/เส้นทางของฉันคือเส้นทางที่ "ถัดไป" แต่เนื่องจากเส้นทางเดียวของฉันจะเป็น/เส้นทางการโพสต์ที่อัปเดตของฉันฉันจึงคิดว่ามันจะใช้ได้ดี

คำตอบ:


198

ซึ่งจะได้ผลขึ้นอยู่กับว่าไคลเอนต์รับทำอะไรเมื่อส่งผ่านไม่ได้กำหนดเป็นพารามิเตอร์แรก

สิ่งนี้จะปลอดภัยกว่า:

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

ไม่มีปัญหาในการโทร next () ในการโทรกลับ

ด้วยเหตุนี้ตัวจัดการจะถูกเรียกตามลำดับที่เพิ่มตราบใดที่เส้นทางถัดไปของคุณคือ app.get ('/', ... ) จะถูกเรียกหากไม่มีคีย์


ขอบคุณผู้ชาย คุณเป็นทางเลือกที่ชื่นชมเช่นกัน น่าเศร้าที่ฉันมีปัญหาอื่น client.getแต่ผมคิดว่าเหมือนคุณชี้ให้เห็นว่ามันเป็นผลมาจากสิ่งที่ถูกส่งกลับโดย ฉันเกิดcannot call method 'indexOf' of nullข้อผิดพลาด
Qcom

นอกจากนี้ยังเป็นไปได้ที่จะโทรnext()เข้าelse{}?
Qcom

ขออภัยสำหรับ commentfest lol ได้รับการแก้ไขแล้ว แต่มัน
แย่มาก

3

รุ่น Express:

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

พารามิเตอร์เสริมมีประโยชน์มากคุณสามารถประกาศและใช้งานได้อย่างง่ายดายโดยใช้ 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);
    }
});

ในโค้ดข้างต้นBatchNoเป็นตัวเลือก Express จะนับเป็นทางเลือกเนื่องจากหลังจากในการสร้าง URL ฉันให้เครื่องหมาย "?" สัญลักษณ์หลัง batchNo '/: batchNo?'

ตอนนี้ฉันสามารถโทรได้เฉพาะ categoryId และ productId หรือด้วยพารามิเตอร์ทั้งสามตัว

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

ป้อนคำอธิบายภาพที่นี่ ป้อนคำอธิบายภาพที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.