J'essaie d'avoir une route couvrant tout, /foo
y compris /foo
lui-même. J'ai essayé d'utiliser /foo*
quel travail pour tout sauf qu'il ne correspond pas /foo
. Observer:
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);
Les sorties:
$ curl localhost:3000/foo
Foo
$ curl localhost:3000/foo/bar
Foo*
Foo Bar
Quelles sont mes options? Le mieux que j'ai trouvé est de tracer /fo*
ce qui, bien sûr, n'est pas très optimal car cela correspondrait beaucoup trop.
/foo*
routes comme ça, ne voulez-vous pas en faire un middleware à la place?/foo*
matchs/foo/bar
mais aussi des matchs/foolish
auxquels vous n'aviez probablement pas l'intention.Réponses:
Je pense que vous devrez avoir 2 itinéraires. Si vous regardez la ligne 331 du routeur de connexion, le * dans un chemin est remplacé par. + Donc correspondra à 1 ou plusieurs caractères.
https://github.com/senchalabs/connect/blob/master/lib/middleware/router.js
Si vous avez 2 itinéraires qui effectuent la même action, vous pouvez faire ce qui suit pour le garder SEC .
la source
app.get(["/foo", "/foo*"], /* function */);
pourrait être préférentiel aussi!Le routeur de connexion a maintenant été supprimé ( https://github.com/senchalabs/connect/issues/262 ), l'auteur déclarant que vous devez utiliser un framework au-dessus de connect (comme Express) pour le routage.
Express traite actuellement
app.get("/foo*")
commeapp.get(/\/foo(.*)/)
, supprimant le besoin de deux itinéraires distincts. Ceci est en contraste avec la réponse précédente (faisant référence au routeur de connexion maintenant supprimé) qui déclarait que "*
dans un chemin est remplacé par.+
".Mise à jour: Express utilise désormais le module "path-to-regexp" (depuis Express 4.0.0) qui conserve le même comportement dans la version actuellement référencée. Je ne sais pas si la dernière version de ce module conserve le comportement, mais pour l'instant, cette réponse est valable.
la source
/\/foo(.+)/
si vous voulez faire correspondre/foo
suivi d'un ou plusieurs caractères, et/foo*
ou/\/foo(.*)/
si vous voulez faire correspondre/foo
suivi de zéro ou plusieurs caractères.Voici un exemple entièrement fonctionnel, n'hésitez pas à copier et coller ceci dans un fichier .js à exécuter avec node, et à jouer avec dans un navigateur (ou curl):
la source
Dans le tableau, vous pouvez également utiliser des variables passant à req.params:
la source
Pour ceux qui apprennent node / express (tout comme moi): n'utilisez pas le routage générique si possible!
Je voulais également implémenter le routage pour GET / users /: id / tout en utilisant le routage générique. Voilà comment je suis arrivé ici.
Heureusement, j'ai aussi trouvé cet article: http://www.jongleberry.com/wildcard-routing-is-an-anti-pattern.html
Bravo, Robert
la source