express.js - pengendali perutean tunggal untuk beberapa rute dalam satu baris

109

Apakah ada cara untuk melakukannya dengan satu panggilan fungsi?

var todo = function (req, res){};

app.get("/", todo);
app.get("/blabla", todo);
app.get("/blablablabla", todo);

Sesuatu seperti:

app.get("/", "/blabla", "/blablablabla", todo );

Saya tahu ini adalah kekacauan sintaks, tetapi hanya untuk memberikan gambaran tentang apa yang ingin saya capai, serangkaian rute akan luar biasa!

Ada yang tahu bagaimana melakukan ini?

Aronis Mariano
sumber
2
Anda harus dapat menulis ekspresi reguler yang akan cocok dengan semua rute yang ingin Anda rutekan untuk dilakukan, dan menggunakan ekspresi reguler sebagai titik akhir Anda. Ini mungkin akan terlihat berantakan, tetapi itu akan berhasil. Saya tidak memposting ini sebagai jawaban karena saya tidak yakin apa ekspresi regulernya, dan ini lebih mendorong ke arah itu. Ada sebutan untuk menggunakan ekspresi reguler dalam dokumen di sini: expressjs.com/api.html#app.VERB
Nick Mitchinson
saya tidak memiliki pengalaman dengan regex di JS ... saya akan mencobanya ... tetapi opsi lain diterima!
Aronis Mariano
1
Saya juga tidak punya banyak, yang sejujurnya mengapa saya tidak hanya memberikannya kepada Anda, namun pemahaman saya adalah bahwa ekspresi reguler cukup universal; Express harus mengurai ekspresi Anda hampir sama dengan bahasa lain.
Nick Mitchinson
1
Ekspresi reguler sangat bermanfaat dan pasti berharga untuk dipelajari. Ini solusinya: app.get (/ ^ \ / ((blabla) {0,2}) $ /, function (req, resp) {var matched = req.params [0]; resp .set ('Content- ketik ',' text / plain ') .send ("Cocok:'" + cocok + "'");}); Beberapa hal: 1. regex dimulai dan diakhiri dengan /, jadi setiap / chars harus di-escape. 2. ^ char cocok dengan awal string, $ char cocok dengan akhir string. Tanpa mereka, pertandingan akan berhasil bahkan dengan karakter asing di awal atau akhir jalur, yaitu / x / blablaxxx
John Deighan

Jawaban:

132

Saya menemukan pertanyaan ini sambil mencari fungsi yang sama.

@Jonathan Ong disebutkan dalam komentar di atas bahwa menggunakan array untuk jalur tidak digunakan lagi tetapi secara eksplisit dijelaskan di Express 4, dan berfungsi di Express 3.x. Berikut contoh sesuatu untuk dicoba:

app.get(
    ['/test', '/alternative', '/barcus*', '/farcus/:farcus/', '/hoop(|la|lapoo|lul)/poo'],
    function ( request, response ) {

    }
);

Dari dalam requestobjek, dengan jalur /hooplul/poo?bandle=froo&bandle=pee&bof=blarg:

"route": {
    "keys": [
        {
            "optional": false, 
            "name": "farcus"
        }
    ], 
    "callbacks": [
        null
    ], 
    "params": [
        null, 
        null, 
        "lul"
    ], 
    "regexp": {}, 
    "path": [
        "/test", 
        "/alternative", 
        "/barcus*", 
        "/farcus/:farcus/", 
        "/hoop(|la|lapoo|lul)/poo"
    ], 
    "method": "get"
}, 

Perhatikan apa yang terjadi dengan params: Ia mengetahui grup dan params yang menangkap di semua jalur yang memungkinkan, apakah mereka digunakan dalam permintaan saat ini atau tidak.

Jadi menumpuk beberapa jalur melalui larik dapat dilakukan dengan mudah, tetapi efek sampingnya mungkin tidak dapat diprediksi jika Anda berharap untuk mengambil sesuatu yang berguna dari jalur yang digunakan oleh params atau grup tangkap. Ini mungkin lebih berguna untuk redundansi / aliasing, dalam hal ini akan bekerja dengan sangat baik.

Edit: Silakan lihat juga jawaban @ c24w di bawah ini .

Sunting 2: Ini adalah jawaban yang cukup populer. Harap diingat bahwa ExpressJS, seperti kebanyakan pustaka Node.js, adalah pesta yang dapat dipindahkan. Sementara perutean di atas masih berfungsi (saya menggunakannya saat ini, fitur yang sangat berguna), saya tidak dapat menjamin keluaran dari objek permintaan (ini tentu berbeda dari apa yang saya jelaskan). Harap uji dengan cermat untuk memastikan Anda mendapatkan hasil yang diinginkan.

Kevin Teljeur
sumber
58
app.get('/:var(bla|blabla)?', todo)

:varsetel req.paramyang tidak Anda gunakan. ini hanya digunakan dalam kasus ini untuk menyetel regex.

(bla|blabla)menyetel ekspresi reguler agar cocok, sehingga cocok dengan string bladan blablah.

?menjadikan seluruh regex opsional, sehingga cocok /juga.

Jonathan Ong
sumber
1
/bla(bla)?juga berfungsi, tetapi parameter apa pun setelahnya tidak terisi dengan benar (mis. /bla(bla)?/:valuetidak terisi req.params.value). Ada yang tahu kenapa?
joscarsson
Jika Anda menggunakan ekspres, Anda bisa mendapatkannya req.params.vartetapi Anda perlu memastikan bahwa Anda telah reqmeneruskan ke fungsinya
Matt The Ninja
51

Anda benar-benar dapat mengirimkan serangkaian jalur , seperti yang Anda sebutkan, dan itu berfungsi dengan baik:

var a = ['/', '/blabla', '/blablablabla'];
app.get(a, todo);
alex
sumber
28
Apa pengganti untuk ini yang sudah tidak digunakan lagi?
brandonscript
5
@JonathanOng Anda mengatakan ini sudah usang, dan remus menanyakan apa penggantinya. Bisakah Anda menjawab pertanyaannya?
nbro
router.route (['/ mailer / out / system', '/ mailer / out / payment']) berfungsi dengan baik di express 4 no deprecation warning
danday74
2
@JonathanOng melihat dokumen Express v4 saat ini menggunakan array tampaknya tidak digunakan lagi.
Jason Axelson
32

Sekadar menguraikan jawaban Kevin , ini dari dokumen 4.x :

Lokasi pemanggilan fungsi middleware; dapat berupa salah satu dari:

  • String yang merepresentasikan jalur.
  • Pola jalur.
  • Pola ekspresi reguler untuk mencocokkan jalur.
  • Larik kombinasi dari salah satu di atas.

Mereka memiliki beberapa contoh , termasuk:

Ini akan cocok jalur dimulai dengan /abcd, /xyza, /lmn, dan /pqr:

app.use(['/abcd', '/xyza', /\/lmn|\/pqr/], function (req, res, next) {
  next();
});
c24w
sumber
11

Saya pergi untuk:

['path', 'altPath'].forEach(function(path) {
  app.get(path, function(req, res) { etc. });
});
Augustin Riedinger
sumber
-2

memerlukan file dari rute asli Anda dan tentukan rute baru seperti ini

var user = require('./users');
router.post('/login', user.post('/login'));
Roman Mahrer
sumber