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

これは、最初のパラメーターとしてundefinedが渡されたときにclient.getが何をするかに応じて機能します。

このようなものの方が安全です:

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 2011

また、呼び出すことが可能だろうnext()else{}
Qcom 2011

コメントフェストでごめんなさい笑。修正されましたが、スーパージャンクxD
Qcom 2011

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のみ、または3つのパラメーターすべてを使用して呼び出すことができます。

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.