Chuyển điều khiển tuyến đường với tham số tùy chọn sau khi root trong express?


87

Tôi đang làm việc trên một ứng dụng rút ngắn url đơn giản và có các tuyến đường tốc hành sau:

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

Tôi muốn xóa /l/khỏi tuyến đường của mình (để làm cho url của tôi ngắn hơn) và đặt tham số: key là tùy chọn. Đây có phải là cách chính xác để làm điều này:

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

Không chắc liệu tôi có cần chỉ định rằng /tuyến đường của tôi là tuyến đường được "nexted" hay không. Nhưng vì tuyến đường khác duy nhất của tôi sẽ là /tuyến đường đăng bài cập nhật của tôi , tôi sẽ tưởng tượng nó sẽ hoạt động tốt.

Câu trả lời:


193

Điều đó sẽ hoạt động tùy thuộc vào những gì client.get thực hiện khi được truyền không xác định làm tham số đầu tiên của nó.

Một cái gì đó như thế này sẽ an toàn hơn:

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

Không có vấn đề gì khi gọi next () bên trong callback.

Theo điều này , các trình xử lý được gọi theo thứ tự mà chúng được thêm vào, vì vậy, miễn là tuyến tiếp theo của bạn là app.get ('/', ...) nó sẽ được gọi nếu không có khóa.


Cảm ơn, anh bạn. Bạn thay thế cũng được đánh giá cao. Đáng buồn thay, tôi có một vấn đề khác, nhưng tôi nghĩ như bạn đã chỉ ra rằng đó là kết quả của những gì được trả về client.get. Tôi có cannot call method 'indexOf' of nulllỗi.
Qcom

Ngoài ra, nó có thể được gọi next()trong else{}?
Qcom

Xin lỗi vì commentfest lol. Đã nhận nó cố định, nhưng đó là siêu JANK xD
QCOM

1

Phiên bản Express:

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

Tham số tùy chọn rất tiện dụng, bạn có thể khai báo và sử dụng chúng dễ dàng bằng cách sử dụng 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);
    }
});

Trong đoạn mã trên, batchNo là tùy chọn. Express sẽ tính nó là tùy chọn vì sau khi xây dựng URL, tôi đã đưa ra dấu '?' ký hiệu sau batchNo '/: batchNo?'

Bây giờ tôi có thể gọi chỉ với categoryId và productId hoặc với tất cả ba tham số.

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

nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.