express.js - tek bir satırda birden çok yol için tek yönlendirme işleyicisi


109

Bunu tek bir işlev çağrısında yapmanın bir yolu var mı?

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

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

Gibi bir şey:

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

Bunun bir söz dizimi karmaşası olduğunu biliyorum, ancak sadece neye ulaşmak istediğime dair bir fikir verdiğim için, bir dizi rota harika olurdu!

Bunun nasıl yapılacağını bilen var mı?


2
Yönlendirmek istediğiniz tüm rotalarla eşleşecek bir normal ifade yazabilmeli ve normal ifadeyi uç noktanız olarak kullanmalısınız. Dağınık görünebilir ama işe yarayacak. Normal ifadenin ne olacağından emin olmadığım için bunu bir cevap olarak göndermiyorum ve bu daha çok o yöne doğru bir itme. Buradaki dokümanlarda normal ifadelerin kullanılmasından bahsediliyor: expressjs.com/api.html#app.VERB
Nick

JS'de regex deneyimim yok ... bir deneyin ... ama başka bir seçenek de kabul edilir!
Aronis Mariano

1
Bende de pek bir şey yok, bu yüzden dürüst olmak gerekirse, bunu sadece size vermedim, ancak benim anlayışıma göre, normal ifadeler oldukça evrenseldir; Express, ifadelerinizi diğer dillerle hemen hemen aynı şekilde ayrıştırmalıdır.
Nick Mitchinson

1
Düzenli ifadeler çok güçlüdür ve kesinlikle öğrenmeye değer. İşte bir çözüm: app.get (/ ^ \ / ((blabla) {0,2}) $ /, function (req, resp) {var matched = req.params [0]; resp .set ('Content- yazın ',' metin / düz ') .send ("Eşleşen:'" + eşleşti + "'");}); Birkaç şey: 1. regex'ler a / ile başlar ve biter, bu nedenle herhangi / chars'dan kaçınılmalıdır. 2. ^ karakter dizenin başıyla, $ karakter dizenin sonuyla eşleşir. Onlar olmadan, maç yolun başında veya sonunda gereksiz karakterlerle bile başarılı olacaktır, yani / x / blablaxxx
John Deighan

Yanıtlar:


132

Aynı işlevselliği ararken bu soruyla karşılaştım.

@Jonathan Ong, yukarıdaki bir yorumda, yollar için dizi kullanmanın kullanımdan kaldırıldığını, ancak bunun Express 4'te açıkça açıklandığından ve Express 3.x'te çalıştığından bahsetti. İşte deneyebileceğiniz bir şey örneği:

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

    }
);

requestNesnenin içinden şu yolla /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"
}, 

Parametrelere ne olduğuna dikkat edin: Mevcut talepte kullanılıp kullanılmadığına bakılmaksızın, olası tüm yollardaki yakalama gruplarının ve parametrelerin farkındadır.

Bu nedenle, bir dizi aracılığıyla birden fazla yolu istiflemek kolaylıkla yapılabilir, ancak param veya yakalama grupları aracılığıyla kullanılan yoldan yararlı bir şey almayı umuyorsanız, yan etkiler muhtemelen tahmin edilemez. Yedeklilik / takma ad için muhtemelen daha kullanışlıdır, bu durumda çok iyi çalışacaktır.

Düzenleme: Ayrıca bakınız @ c24w cevabı aşağıda .

Düzenleme 2: Bu oldukça popüler bir cevaptır. Lütfen çoğu Node.js kitaplığında olduğu gibi ExpressJS'nin taşınabilir bir şölen olduğunu unutmayın. Yukarıdaki yönlendirme hala çalışsa da (şu anda kullanıyorum, çok kullanışlı bir özellik), istek nesnesinin çıktısı için kefil olamıyorum (açıkladığımdan kesinlikle farklı). Lütfen istenen sonuçları aldığınızdan emin olmak için dikkatlice test edin.


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

:varkullanmadığınızı ayarlar req.param. yalnızca bu durumda normal ifadeyi ayarlamak için kullanılır.

(bla|blabla)normal ifadeyi eşleşecek şekilde ayarlar, böylece dizelerle eşleşir blave blablah.

?tüm normal ifadeyi isteğe bağlı yapar, böylece aynı zamanda eşleşir /.


1
/bla(bla)?da çalışır, ancak sonraki parametreler düzgün şekilde doldurulmaz (yani /bla(bla)?/:valuedoldurulmaz req.params.value). Nedenini bilen var mı?
joscarsson

Ekspres kullanıyorsanız, onu alabilirsiniz, req.params.varancak reqişleve geçtiğinizden emin olmalısınız
Matt The Ninja

51

Aslında bahsettiğiniz gibi bir dizi yoldan geçebilirsiniz ve bu harika çalışıyor:

var a = ['/', '/blabla', '/blablablabla'];
app.get(a, todo);

28
Kullanımdan kaldırılan bunun yerini ne alacak?
brandonscript

5
@JonathanOng Bunun kullanımdan kaldırıldığını söylüyorsunuz ve remus bunun yerine ne olduğunu soruyor. Lütfen sorusuna cevap verir misiniz?
nbro

router.route (['/ mailer / out / system', '/ mailer / out / payment']) ekspres 4'te gayet iyi çalışıyor, kullanımdan
kaldırma

2
@JonathanOng, bir dizi kullanan mevcut Express v4 dokümanlarına bakmak, kullanımdan kaldırılmış görünmüyor.
Jason Axelson

32

Sadece Kevin'in cevabını detaylandırmak için , bu 4.x belgelerinden :

Ara yazılım işlevinin çağrıldığı yol; şunlardan herhangi biri olabilir:

  • Bir yolu temsil eden bir dize.
  • Bir yol deseni.
  • Yollarla eşleşecek normal bir ifade deseni.
  • Yukarıdakilerin herhangi birinin bir kombinasyon dizisi.

Aşağıdakiler dahil bazı örnekleri var :

Bu yollar ile başlayan maç olacak /abcd, /xyza, /lmn, ve /pqr:

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

11

Ben gittim:

['path', 'altPath'].forEach(function(path) {
  app.get(path, function(req, res) { etc. });
});

-2

orijinal rotanızın dosyasını gerektirin ve yeni rotayı bunun gibi tanımlayın

var user = require('./users');
router.post('/login', user.post('/login'));
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.