Estoy tratando de tener una ruta que cubra todo, /foo
incluido él /foo
mismo. He intentado usar /foo*
which work para todo, excepto que no coincide /foo
. Observar:
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);
Salidas:
$ curl localhost:3000/foo
Foo
$ curl localhost:3000/foo/bar
Foo*
Foo Bar
¿Cuáles son mis opciones? Lo mejor que se me ha ocurrido es una ruta /fo*
que, por supuesto, no es muy óptima, ya que coincidiría demasiado.
/foo*
rutas así, ¿no quiere convertirlo en middleware?/foo*
coincidencias/foo/bar
pero también coincidencias/foolish
que probablemente no pretendía.Respuestas:
Creo que tendrás que tener 2 rutas. Si observa la línea 331 del enrutador de conexión, el * en una ruta se reemplaza con. +, Por lo que coincidirá con 1 o más caracteres.
https://github.com/senchalabs/connect/blob/master/lib/middleware/router.js
Si tiene 2 rutas que realizan la misma acción, puede hacer lo siguiente para mantenerla SECA .
fuente
app.get(["/foo", "/foo*"], /* function */);
¡También podría ser preferencial!El enrutador de conexión ahora se ha eliminado ( https://github.com/senchalabs/connect/issues/262 ), el autor afirma que debe usar un marco en la parte superior de la conexión (como Express) para el enrutamiento.
Express actualmente trata
app.get("/foo*")
comoapp.get(/\/foo(.*)/)
, eliminando la necesidad de dos rutas separadas. Esto contrasta con la respuesta anterior (refiriéndose al enrutador de conexión ahora eliminado) que decía que "*
en una ruta se reemplaza con.+
".Actualización: Express ahora usa el módulo "path-to-regexp" (desde Express 4.0.0) que mantiene el mismo comportamiento en la versión actualmente referenciada. No me queda claro si la última versión de ese módulo mantiene el comportamiento, pero por ahora esta respuesta se mantiene.
fuente
/\/foo(.+)/
si desea hacer coincidir/foo
seguido de uno o más caracteres,/foo*
o/\/foo(.*)/
si desea hacer coincidir/foo
seguido de cero o más caracteres.Aquí hay un ejemplo completamente funcional, siéntase libre de copiar y pegar esto en un archivo .js para ejecutarlo con el nodo y jugar con él en un navegador (o curl):
fuente
En la matriz también puede usar variables que pasan a req.params:
fuente
Para aquellos que están aprendiendo node / express (como yo): ¡no use el enrutamiento comodín si es posible!
También quería implementar el enrutamiento para GET / users /: id / anything usando el enrutamiento comodín. Así es como llegué aquí.
Afortunadamente también he encontrado este artículo: http://www.jongleberry.com/wildcard-routing-is-an-anti-pattern.html
Saludos, Robert
fuente