Meneruskan kontrol rute dengan parameter opsional setelah root di ekspres?

91

Saya sedang mengerjakan aplikasi pemendek url sederhana dan memiliki rute ekspres berikut:

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

Saya ingin menghapus /l/dari rute saya (untuk mempersingkat url saya) dan menjadikan: parameter kunci opsional. Apakah ini cara yang benar untuk melakukan ini:

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

Tidak yakin apakah saya perlu menentukan bahwa /rute saya adalah yang akan "selanjutnya". Tapi karena satu-satunya rute saya yang lain adalah rute posting saya yang diperbarui /, saya membayangkan itu akan berfungsi dengan baik.

Qcom
sumber

Jawaban:

198

Itu akan bekerja tergantung pada apa yang dilakukan client.get ketika diteruskan tidak ditentukan sebagai parameter pertamanya.

Sesuatu seperti ini akan lebih aman:

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

Tidak ada masalah dalam memanggil next () di dalam callback.

Menurut ini , penangan dipanggil dalam urutan penambahannya, selama rute Anda berikutnya adalah app.get ('/', ...) itu akan dipanggil jika tidak ada kunci.

Ernesto Badillo
sumber
Terima kasih sobat. Alternatif Anda juga dihargai. Sayangnya saya memiliki masalah lain, tetapi saya pikir seperti Anda menunjukkan itu adalah hasil dari apa yang dikembalikan client.get. Saya mengalami cannot call method 'indexOf' of nullkesalahan.
Qcom
Juga, apakah mungkin untuk memanggil next()dalam else{}?
Qcom
Maaf untuk commentfest lol. Sudah diperbaiki, tapi super jank xD
Qcom
3

Versi ekspres:

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

Parameter opsional sangat berguna, Anda dapat mendeklarasikan dan menggunakannya dengan mudah menggunakan 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);
    }
});

Dalam kode batchNo di atas adalah opsional. Express akan menghitungnya sebagai opsional karena setelah dalam pembuatan URL, saya memberikan '?' simbol setelah batchNo '/: batchNo?'

Sekarang saya dapat memanggil hanya dengan categoryId dan productId atau dengan ketiga parameter.

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

masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini

Tuan
sumber