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.