Ich habe eine Route, die so aussieht:
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
}
});
Dies funktioniert jedoch nicht - wenn ich anrufe path/foo/bar
, trifft es die Route, aber wenn ich anrufe path/foo
, funktioniert es nicht.
Ist es möglich, einen optionalen Splat-Parameter zu haben, oder muss ich einen regulären Ausdruck verwenden, um dies zu erkennen?
Bearbeiten :
Um es klarer zu machen, hier sind die Anforderungen, die ich zu erreichen versuche:
- Der erste und der zweite Parameter sind erforderlich
- Der erste Parameter ist statisch, der zweite ist ein benannter Parameter.
- Eine beliebige Anzahl optionaler zusätzlicher Parameter kann angehängt werden und trotzdem die Route treffen.
'/path/:firstParam/*'
. Wenn Sie es brauchen, tun Sie es'/path/:firstParam/:secondParam?/*'
./path/foo
(so sah meine Route ursprünglich aus, bevor ich einen optionalen Splat wollte). Darüber hinaus negiert in Ihrem zweiten Beispiel das Hinzufügen des Splat den optionalen zweiten Parameter - stimmt/path/foo
nicht mit Ihrem zweiten Muster überein (und auch nicht/path/foo/bar
...) - einer der nervigeren Teile des Express-Routers./path/:firstParam
und/path/:firstParam/:secondParam/
als zwei separate Router mit einem gemeinsam genutzten Controller entscheiden. Keine Notwendigkeit, Ihre URLs verwirrend zu machenn
Endpunkten ist für das Design der App notwendig - ich bin nicht nur das Routing zu 1-3 params kann eine beliebige Zahl sein, so eine Begrenzung der Anzahl der params aufweisen , ist keine Option (sicher, ich 10 Endpunkte erstellen könnte, Aber wenn Express diese Arbeit macht, ist das nicht besser als auf einer Route. Ich kann eine Regex-Route verwenden, um mein Problem zu lösen (was ich gerade mache), aber ich hatte gehofft, eine lesbare Option zu haben./path/:param(/:otherOptionalParam)
Antworten:
Dies funktioniert für / path und / path / foo in Express 4, beachten Sie die
*
vorherigen?
.router.get('/path/:id*?', function(req, res, next) { res.render('page', { title: req.params.id }); });
quelle
/path/foo/bar/bazzle
,req.params.id
gleichfoo
undreq.params[0]
gleich ist/bar/bazzle
, was einige Leute stolpern kann. Eine sauberere Lösung kann sein , den Pfad zu definieren , wie/path/*?
, die ausdrücken 4 gesetztreq.params[0]
zufoo/bar/bazzle
, was wahrscheinlich näher ist , was Sie suchen./path/foo/bar
aber nicht übereinstimmen/path/foo
. Ich habe es versucht,'/path/:id/*
aber es*
scheint auch mit einer leeren Zeichenfolge übereinzustimmen.Ich hatte gerade das gleiche Problem und löste es. Das habe ich benutzt:
app.get('path/:required/:optional?*', ...)
Dies sollte für Arbeit
path/meow
,path/meow/voof
,path/meow/voof/moo/etc
...Es scheint, als würde durch das Löschen von
/
zwischen?
und*
das letzte ebenfalls/
optional, während es:optional?
optional bleibt.quelle
Wird das tun, wonach Sie suchen?
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 } });
Weitere Informationen zum Routing von Express finden Sie hier, wenn Sie nicht nachgesehen haben: http://expressjs.com/guide/routing.html
quelle
/path/foo/bar
, aber nicht/path/foo/bar/baz
- die*
Splat-Matches.+
, die für das, was ich tue, notwendig sind - ich habe definitiv rtfm, scheint es nicht zu erwähnen, also ist es vielleicht nicht möglich ...Hier ist die aktuelle Art und Weise, wie ich dieses Problem löse. Es scheint nicht, dass Express eine beliebige Anzahl von Splat-Parametern mit einem optionalen benannten Parameter unterstützt:
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 } });
Ich würde diese Verwendung gerne als Parameter für Lesbarkeit und Konsistenz verwenden lassen - wenn eine andere Antwort auftaucht, die dies zulässt, werde ich sie akzeptieren.
quelle
Angenommen, Sie haben diese URL:
/api/readFile/c:/a/a.txt
Wenn Sie möchten ,
req.params.path
seinc:
:'/api/readFile/:path*
Wenn Sie möchten ,
req.params.path
seinc:/a/a.txt
:'/api/readFile/:path([^/]*)'
quelle
Die oben genannten Lösungen mit optional funktionieren in Express 4 nicht. Ich habe verschiedene Methoden zur Verwendung von Suchmustern ausprobiert, aber auch nicht. Und dann habe ich diese Methode gefunden und scheint für den unbegrenzten verschachtelten Pfad http://expressjs.com/api.html#router gefeuert zu sein
// 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(); });
Es stimmt mit allen überein / bar, / bar / z, / bar / a / b / c usw. Und danach können Sie req.originalUrl lesen, da die Parameter nicht gefüllt sind, z. Sie können versuchen, baseUrl und originalUrl zu vergleichen, um den verbleibenden Pfad zu erhalten.
quelle
Ich habe um dieses Problem durch eine Kombination aus einer Middleware , die folgenden Schrägstriche zu URL hinzufügen und
router.get('/bar/*?', ...
, die alles abholen wird nach/bar/
und Rückkehr ,undefined
wenn es gerade ist/bar/
. Wenn der Besucher danach fragt/bar
,express-slash
fügt die Middleware der Anfrage einen Schrägstrich hinzu und wandelt die Anfrage in um/bar/
.quelle