Express에서 루트 후 선택적 매개 변수로 경로 제어를 전달합니까?


87

간단한 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을 더 짧게 만들기 위해) : key 매개 변수를 선택적으로 만들고 싶습니다. 이것이 올바른 방법입니까?

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

이는 client.get이 첫 번째 매개 변수로 undefined를 전달할 때 수행하는 작업에 따라 작동합니다.

이와 같은 것이 더 안전합니다.

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 ()를 호출하는 데 문제가 없습니다.

this 에 따르면 핸들러는 추가 된 순서대로 호출되므로 다음 경로가 app.get ( '/', ...)이면 키가 없으면 호출됩니다.


고마워요 당신은 대안도 감사합니다. 슬프게도 다른 문제가 있지만에서 반환 한 결과라고 지적한 것처럼 생각합니다 client.get. 나는 발생하고있어 cannot call method 'indexOf' of null오류가 발생했습니다.
Qcom 2011-07-22

또한, 전화를 할 수있을 것 next()else{}?
QCOM

commentfest 롤에 대해 죄송합니다. 문제가 해결되었지만 xD가 매우 버벅 거림
Qcom 2011-07-22

1

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.