Bir yol dahil ve altındaki her şeyi kapsayacak şekilde Express-js joker karakter yönlendirme


97

Kendisi /foodahil her şeyi kapsayan bir yol tutturmaya çalışıyorum /foo. Ben kullanarak denedim /foo*her şey için hangi çalışmaları dışında eşleşmiyor /foo. Gözlemek:

var express = require("express"),
    app = express.createServer();

app.get("/foo*", function(req, res, next){
  res.write("Foo*\n");
  next();
});

app.get("/foo", function(req, res){
  res.end("Foo\n");
});

app.get("/foo/bar", function(req, res){
  res.end("Foo Bar\n");
});

app.listen(3000);

Çıktılar:

$ curl localhost:3000/foo
Foo
$ curl localhost:3000/foo/bar
Foo*
Foo Bar

Seçeneklerim neler? Bulduğum en iyi şey, /fo*çok fazla eşleşeceği için elbette çok uygun olmayan bir rota çizmek.


Tüm /foo*rotaları böyle kesiyorsanız, bunun yerine ara yazılım yapmak istemez misiniz?
Raynos

3
Ne istediğine dikkat et: /foo*kibritler /foo/barama /foolishmuhtemelen istemediğin kibritler .
Wyck

Yanıtlar:


114

2 rotanız olması gerektiğini düşünüyorum. Bağlantı yönlendiricisinin 331. satırına bakarsanız, yoldaki * işareti. + İle değiştirilir, böylece 1 veya daha fazla karakter eşleşir.

https://github.com/senchalabs/connect/blob/master/lib/middleware/router.js

Aynı eylemi gerçekleştiren 2 rotanız varsa, KURU tutmak için aşağıdakileri yapabilirsiniz .

var express = require("express"),
    app = express.createServer();

function fooRoute(req, res, next) {
  res.end("Foo Route\n");
}

app.get("/foo*", fooRoute);
app.get("/foo", fooRoute);

app.listen(3000);

105
app.get(["/foo", "/foo*"], /* function */);tercihli de olabilir!
Chris Foster

9
Bir dizi dizgeyi aktarmak da benim için tercihli. Maalesef: app.VERB () 'e bir dizi geçirmek kullanımdan kaldırıldı ve 4.0'da kaldırılacak
CodeWarrior

10
Bir dizi dizginin aktarılması, Express 4.9.1'de geri yüklendi.
Pete TNT

30

Bağlantı yönlendiricisi artık kaldırılmıştır ( https://github.com/senchalabs/connect/issues/262 ), yazar yönlendirme için bağlantının üstünde (Express gibi) bir çerçeve kullanmanız gerektiğini belirtmiştir.

Hızlı anda davranır app.get("/foo*") olarak app.get(/\/foo(.*)/)iki ayrı güzergah ihtiyacını ortadan kaldırarak,. Bu, " *bir yolda .+" ile değiştirildiğini "belirten önceki yanıtın (artık kaldırılan bağlantı yönlendiricisine atıfta bulunarak) tezattır .

Güncelleme: Express , şu anda referans verilen sürümde aynı davranışı sürdüren "regexp'e giden yol" modülünü (Express 4.0.0'dan beri) kullanıyor . Bu modülün en son sürümünün davranışı koruyup korumadığı benim için net değil, ancak şimdilik bu yanıt duruyor.


Öyleyse. + Veya * kullanmalı mıyız?
Tyler Langan

2
Kullan /\/foo(.+)/sen eşleşecek istiyorsanız /foobir veya birden fazla karakterle devam eden ve /foo*ya /\/foo(.*)/sen eşleşecek istiyorsanız /foosıfır veya daha fazla karakterle devam.
Johann

12

İki rotaya sahip olmak gerekli değildir.

Basitçe dizenizin (/*)?sonuna ekleyin path.

Örneğin, app.get('/hello/world(/*)?' /* ... */)

İşte tam olarak çalışan bir örnek, düğümle çalıştırmak için bunu kopyalayıp bir .js dosyasına yapıştırmaktan çekinmeyin ve onunla bir tarayıcıda (veya curl) oynatın:

const app = require('express')()

// will be able to match all of the following
const test1 = 'http://localhost:3000/hello/world'
const test2 = 'http://localhost:3000/hello/world/'
const test3 = 'http://localhost:3000/hello/world/with/more/stuff'

// but fail at this one
const failTest = 'http://localhost:3000/foo/world'

app.get('/hello/world(/*)?', (req, res) => res.send(`
    This will match at example endpoints: <br><br>
    <pre><a href="${test1}">${test1}</a></pre>
    <pre><a href="${test2}">${test2}</a></pre>
    <pre><a href="${test3}">${test3}</a></pre>

    <br><br> Will NOT match at: <pre><a href="${failTest}">${failTest}</a></pre>
`))

app.listen(3000, () => console.log('Check this out in a browser at http://localhost:3000/hello/world!'))

9

Dizide ayrıca req.params'e geçen değişkenleri de kullanabilirsiniz:

app.get(["/:foo", "/:foo/:bar"], /* function */);

4

Düğüm / ekspres öğrenenler için (tıpkı benim gibi): Mümkünse joker karakter yönlendirmeyi kullanmayın!

Ayrıca, joker yönlendirmeyi kullanarak GET / users /: id / ne olursa olsun yönlendirmesini uygulamak istedim. Buraya böyle geldim.

Daha fazla bilgi: https://blog.praveen.science/wildcard-routing-is-an-anti-pattern/


3
Bağlantı şu anda çalışmıyor. Belki de şununla
Ron Burk

@RonBurk url'niz de ölü görünüyor .. Adlandırılmış bir parametreden sonra isteğe bağlı joker karaktere nasıl sahip olabilirim ? "/ bir şey /: kimlik (/ *)?" çalışmıyor ..
Soichi Hayashi

Muhtemelen bir süre daha Google önbelleğinde kalacak
Ron Burk

URL'nin ilk kısmından sonra ne geleceği hakkında hiçbir fikrim yoksa joker karakter yönlendirmeye bir alternatif var mı?
Michael

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.