1. ホーム
  2. node.js

[解決済み] expressでrootの後にオプションのパラメータでルート制御を渡す?

2023-01-17 16:08:24

質問

シンプルな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/ を削除し、: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
  });
});

を指定する必要があるかどうかは分かりませんが、私の / ルートに指定する必要があるかどうかはわかりません。 しかし、私の唯一のルートは、更新された投稿であるため / ルートしかないので、うまくいくだろうと想像しています。

どのように解決するのですか?

それは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()を呼び出しても問題ないです。

によれば この によると、ハンドラは追加された順に呼び出されるので、次のルートが app.get('/', ...) である限り、キーがない場合に呼び出されます。