2013-09-04 13 views
12

Die folgende:Optional GET-Parameter in Express Route

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

Streichhölzer

/foo/start/1/end/4 

aber ich will es auch einen optionalen Parameter dieses

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

Ich habe versucht, entsprechen:

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

, aber es passt keines der beiden obigen Beispiele. Ich denke es ist, weil ich versuche, es RegExp zu geben, wenn es etwas anderes erwartet?

Danke.

+0

Sie können Pfade mit RegExps nicht mischen, was Sie tun. Verwenden Sie nur einen Pfad oder nur eine RegExp. http://expressjs.com/api.html#app.VERB – tim

Antwort

19

Warum Sie keine andere Regel vor den man hinzufügen, die Sie haben, wie dies

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

Es wird ohne den optionalen Wert vor dem einen verwendet werden.

Wenn Sie diese verwenden möchten, nur eine Zeile versuchen:

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

siehe the docs für ein Beispiel.

+2

Yeh, kann ich tun, aber ich dachte, es wäre sauberer, eine Regel (wenn möglich) zu haben :) – ale

+0

Ich habe meine Antwort bearbeitet, um diese Option hinzuzufügen. –

+1

Leistung Killer ... Regexp könnte effizienter sein. – CuSS

5

Sie können auch reguläre Ausdrücke in Routen verwenden. Vielleicht so etwas wie:

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

Dies sieht schmutzig Typ :) –

+10

Warum? Express übersetzt * alle * Routenzeichenfolgen in reguläre Ausdrücke. Die Verwendung von Regex direkt bezieht sich auf die gesamte Dokumentation: http://expressjs.com/4x/api.html#request – MateodelNorte

+1

Ich weiß, dass es Sarkasmus war. –

15

Wenn Sie Express 4.x verwenden Dann denke ich, es ist besser, Array-Format für Route zu verwenden. Zum Beispiel habe ich Route /service, die alle Service-Liste und die gleiche Route gibt, wenn mit ID verwendet /service/id/:id gibt einzigen Dienst mit ID im Param.

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

Saubere Antwort, nur Frage kann ich vermeiden, zweimal '/ Service' zu schreiben? – orepor

+0

, die regelmäßigen Ausdruck brauchen, das ist sauber. –

6

In diesem Beispiel, wenn die URL ist/Hallo oder/Hallo/Welt funktioniert es. Das ? macht den Parameter optional (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); 
}); 
Verwandte Themen