2012-04-04 11 views
58

Ben şöyle bir rota:Express.js yönlendirme: isteğe bağlı tükürük param?

app.all('/path/:namedParam/*splat?',function(req,res,next){ 
    if(!req.params.length){ 
    // do something when there is no splat 
    } else { 
    // do something with splat 
    } 
}); 

ancak bu çalışmıyor - Ben path/foo/bar çağırırsanız o rotayı vurur ama path/foo çağırırsanız, öyle değil.

İsteğe bağlı bir uyarlama param var mı, yoksa bunu algılamak için düzenli olarak kullanmak zorunda mıyım?

Düzenleme:

net olmak gerekirse, burada elde etmek çalışıyorum gereksinimleri şunlardır:

  • gerekli
  • ilk param statik olan birinci ve ikinci parametreler , ikinci bir adlandırılmış param.
  • herhangi bir sayıda isteğe bağlı ek param eklenebilir ve yine de rotaya vurulabilir.
+1

Ne yapmaya çalışıyorsunuz?uyarısı bilmeniz gerekmiyorsa, sadece '/ yol /: firstParam/*' 'yapın. İhtiyacınız varsa, ''/yol /: firstParam /: secondParam?/* ''Yapın. –

+0

Uyarımın isteğe bağlı olmasını istiyorum - verdiğiniz ilk örnek '/ path/foo 'ile eşleşmeyecektir (isteğe bağlı uyarılar istemeden önce rotam yolum böyle görünüyordu). Buna ek olarak, ikinci örneğinizde, splat eklemenin eklenmesi isteğe bağlı olarak ikinci paramı geçersiz kılar - '/ yol/foo 'ikinci paterninizle eşleşmeyecektir (bu konu için' '/ path/foo/bar' =' '- 'yönlendiricinin daha rahatsız edici kısımları. – Jesse

+1

şahsen ben/path /: firstParam ve '/ path /: firstParam /: secondParam /' için paylaşılan bir denetleyiciye sahip iki ayrı yönlendirici olarak gideceğim. senin URL'lerini karıştırmaya gerek yok –

cevap

66

Bu, ekspres 4'teki/path ve/path/foo için çalışır, ?'dan önce *'u not edin.

router.get('/path/:id*?', function(req, res, next) { 
    res.render('page', { title: req.params.id }); 
}); 
+20

Not: Eğer bu işe yaramazsa, '/ path/foo/bar/bazzle' seçeneğini ziyaret ederseniz,' req.params.id' foo'ya eşit olacaktır. ve 'req.params [0]', bazı insanlara gidebilen '/ bar/bazzle'ya eşit olacaktır. Temizleyici bir çözüm yolu, '/ path/*? 'Olarak tanımlamak olabilir; bu ifade, ifade 4'te' req.params [0] '' 'foo/bar/bazzle'' olarak ayarlayacaktır. aramak. – Jesse

12

Bundan sonra ne yapacaksınız? Eğer bakmadım bile, burada yönlendirme

app.all('/path/:namedParam/:optionalParam?',function(req,res,next){ 
    if(!req.params.optionalParam){ 
    // do something when there is no optionalParam 
    } else { 
    // do something with optionalParam 
    } 
}); 

Express Daha

: http://expressjs.com/guide/routing.html

+1

Bu çözüm '/ path/foo/bar' ile eşleşir, ancak'/path/foo/bar/baz' - '*' splat eşleşmeleri ile eşleşir. + Yaptığım şey için gerekli olan - kesinlikle rtfm var, bahsetmiş görünmüyor, bu yüzden mümkün değil ... – Jesse

2

İşte o ekspres görünmüyor, ben bu sorunu çözüyorum akım yolu uyarısı params herhangi bir sayıda destekler isteğe bağlı isimlendirilmiş parametre ile:

app.all(/\/path\/([^\/]+)\/?(.+)?/,function(req,res,next){ 
    // Note: this is all hacked together because express does not appear to support optional splats. 
    var params = req.params[1] ? [req.params[1]] : [], 
     name = req.params[0]; 
    if(!params.length){ 
    // do something when there is no splat 
    } else { 
    // do something with splat 
    } 
}); 

ben okunabilirlik ve tutarlılık için bu kullanım adlandırılmış params isteriz - bu izin veren başka bir cevap yüzeyleri bunu kabul edersen.

62

Sadece aynı problemi yaşadım ve çözdüm. Bu, path/meow için path/meow/voof, path/meow/voof/moo/etc ...

Bu ? ve * arasında / bırakarak görünüyor

, son / çok opsiyonel hale çalışması gerekir

app.get('path/:required/:optional?*', ...) 

:optional? isteğe kalırken: Bu benim kullandığım budur .

+0

Cool! Bunu test ettim (3.0.0'da, 2.x'de test edilmedim) ve çalışıyor. Bu kesinlikle RegEx hack'imden daha temiz. – Jesse

+5

Bu önceden tanımlanmış anahtar kelimeler hakkında daha fazla bilgiyi nerede okuyabileceğimi biliyor musunuz? –

+7

Ekspres 4.0x'te bu artık işe yaramıyor gibi görünüyor – regretoverflow

0

İsteğe bağlı çözümler isteğe bağlı olarak Express 4'te çalışmaz. Arama kalıplarını kullanarak birkaç yolu denedim ama çalışmadım. Sonra bu yöntemi bulundu ve http://expressjs.com/api.html#router

// this will only be invoked if the path starts with /bar from the mount point 
router.use('/bar', function(req, res, next) { 
    // ... maybe some additional /bar logging ... 

    // to get the url after bar, you can try 
    var filepath = req.originalUrl.replace(req.baseUrl, ""); 

    next(); 
}); 

It maçı tüm/bar/bar/z,/bar/a/b/c vs Ve bundan sonra, okuyabilir, sınırsız iç içe yolu için ateş görünüyor req.originalUrl, paramlar doldurulmadığından, örn. Kalan yolu almak için baseUrl ve originalUrl değerlerini deneyebilirsiniz.