Ich versuche , einen Weg Abdeckung alles haben unter /foo
einschließlich /foo
selbst. Ich habe versucht, /foo*
welche Arbeit für alles zu verwenden, außer dass sie nicht übereinstimmt /foo
. Beobachten:
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);
Ausgänge:
$ curl localhost:3000/foo
Foo
$ curl localhost:3000/foo/bar
Foo*
Foo Bar
Was sind meine Optionen? Das Beste, was ich mir ausgedacht habe, ist eine Route, /fo*
die natürlich nicht sehr optimal ist, da sie viel zu sehr zusammenpassen würde.
/foo*
Routen so abfangen , möchten Sie sie nicht stattdessen zur Middleware machen?/foo*
Streichhölzer,/foo/bar
aber auch Streichhölzer,/foolish
die Sie wahrscheinlich nicht beabsichtigt haben.Antworten:
Ich denke, Sie müssen 2 Routen haben. Wenn Sie sich Zeile 331 des Verbindungsrouters ansehen, wird das * in einem Pfad durch. + Ersetzt, sodass 1 oder mehr Zeichen übereinstimmen.
https://github.com/senchalabs/connect/blob/master/lib/middleware/router.js
Wenn Sie zwei Routen haben, die dieselbe Aktion ausführen, können Sie Folgendes tun, um sie trocken zu halten .
quelle
app.get(["/foo", "/foo*"], /* function */);
könnte auch bevorzugt sein!Der Verbindungsrouter wurde jetzt entfernt ( https://github.com/senchalabs/connect/issues/262 ). Der Autor gab an, dass Sie für das Routing ein Framework über Connect (wie Express) verwenden sollten.
Express wird derzeit
app.get("/foo*")
als behandeltapp.get(/\/foo(.*)/)
, sodass keine zwei separaten Routen erforderlich sind. Dies steht im Gegensatz zu der vorherigen Antwort (bezogen auf den jetzt entfernten Verbindungsrouter), in der angegeben wurde, dass "*
in einem Pfad durch.+
" ersetzt wird.Update: Express verwendet jetzt das Modul "Pfad zum regulären Ausdruck" (seit Express 4.0.0), das das gleiche Verhalten in der aktuell referenzierten Version beibehält . Es ist mir unklar, ob die neueste Version dieses Moduls das Verhalten beibehält, aber für den Moment steht diese Antwort.
quelle
/\/foo(.+)/
Sie diese Option, wenn Sie übereinstimmen möchten,/foo
gefolgt von einem oder mehreren Zeichen,/foo*
oder/\/foo(.*)/
wenn Sie übereinstimmen möchten,/foo
gefolgt von null oder mehreren Zeichen.Hier ist ein voll funktionsfähiges Beispiel. Sie können es kopieren und in eine .js-Datei einfügen, um es mit dem Knoten auszuführen, und damit in einem Browser (oder Curl) spielen:
quelle
Im Array können Sie auch Variablen verwenden, die an req.params übergeben werden:
quelle
Für diejenigen, die Node / Express lernen (genau wie ich): Verwenden Sie nach Möglichkeit kein Wildcard-Routing!
Ich wollte auch das Routing für GET / users /: id / Whatever mithilfe von Wildcard-Routing implementieren. So bin ich hierher gekommen.
Zum Glück habe ich auch diesen Artikel gefunden: http://www.jongleberry.com/wildcard-routing-is-an-anti-pattern.html
Prost, Robert
quelle