2013-09-04 20 views
12

Poniższy:Opcjonalny parametr GET w trasy ekspresowe

app.get('/foo/start/:start/end/:end', blah.someFunc); 

mecze

/foo/start/1/end/4 

ale chcę go również dopasować opcjonalny parametr

/foo/start/1/end/4/optional/7 

próbowałam to:

app.get('/foo/start/:start/end/:end(/optional/:value)?', blah.someFunc); 

ale nie pasuje do żadnego z powyższych dwóch przykładów. Myślę, że to dlatego, że próbuję dać mu RegExp, kiedy spodziewa się czegoś innego?

Dzięki.

+0

Nie można łączyć ścieżek z Regexsem, co właśnie robisz. Należy używać tylko ścieżki lub wyrażenia regularnego. http://expressjs.com/api.html#app.VERB – tim

Odpowiedz

19

Dlaczego nie można dodać kolejną regułę przed jednym masz, jak to

app.get('/foo/start/:start/end/:end/optional/:value', blah.someFunc); 
app.get('/foo/start/:start/end/:end', blah.someFunc); 

będzie on używany przed jeden bez wartości opcjonalnym.

Jeśli chcesz użyć tylko jednej linii spróbuj tego:

app.get('/foo/start/:start/end/:end/optional?', blah.someFunc) 

zobaczyć the docs dla przykładu.

+2

Tak, mogę, ale myślałem, że byłoby czysto mieć jedną regułę (jeśli to możliwe) :) – ale

+0

Edytowałem swoją odpowiedź, aby dodać tę opcję. –

+1

Performance killer ... Regexp może być bardziej wydajny. – CuSS

5

Możesz również używać wyrażeń regularnych na trasach. Być może coś takiego:

app.get(/^\/foo\/start\/:start\/end\/:end(\/optional\/:value)?/, function (req, res, next) { 
+4

Wygląda na brudnego gościa :) –

+10

Dlaczego? Express tłumaczy * wszystkie * ciągi tras do wyrażeń regularnych. Bezpośrednie odwoływanie się do regexes odwołuje się do całej dokumentacji: http://expressjs.com/4x/api.html#request – MateodelNorte

+1

Wiem, że to był sarkazm. –

15

Jeśli korzystasz z Express 4.x Wtedy myślę, że lepiej jest użyć formatu tablicy dla trasy. Na przykład mam trasę /service, która podaje listę wszystkich usług i tę samą trasę, jeśli jest używana z identyfikatorem /service/id/:id, która podaje pojedynczą usługę z identyfikatorem w parametrze.

app.get(['/service', '/service/id/:id'], function(req, res) {}); 
+0

Czysta odpowiedź, tylko pytanie czy mogę uniknąć dwukrotnego napisania "/ service"? – orepor

+0

które potrzebują regularnego wyrażenia, to jest czyste. –

6

W tym przykładzie, jeśli adres URL to/hello lub/hello/world, działa. ? sprawia, że ​​parametr staje się opcjonalny (express 4).

// app.js 
var index = require('/routes/index'); 
app.use('/hello', index); 

// routes/index.js 
router.get('hello/:name?', function(req, res){ 
    var name = req.params.name; 
    var data = { 
    name: name 
    }; 
    res.json(data); 
}); 
Powiązane problemy