express.js: controlador de enrutamiento único para múltiples rutas en una sola línea

107

¿Hay alguna forma de hacer esto en una sola llamada de función?

var todo = function (req, res){};

app.get("/", todo);
app.get("/blabla", todo);
app.get("/blablablabla", todo);

Algo como:

app.get("/", "/blabla", "/blablablabla", todo );

Sé que esto es un lío de sintaxis, pero solo para dar una idea de lo que me gustaría lograr, ¡una serie de rutas sería increíble!

Alguien sabe cómo hacer esto?

Aronis Mariano
fuente
2
Debería poder escribir una expresión regular que coincida con todas las rutas a las que desea enrutar y usar la expresión regular como su punto final. Puede terminar luciendo desordenado, pero funcionará. No estoy publicando esto como una respuesta porque no estoy seguro de cuál sería la expresión regular, y esto es más un impulso en esa dirección. Se menciona el uso de expresiones regulares en los documentos aquí: expressjs.com/api.html#app.VERB
Nick Mitchinson
No tengo experiencia con expresiones regulares en JS ... Lo intentaré ... ¡pero cualquier otra opción es bienvenida!
Aronis Mariano
1
Yo tampoco tengo mucho, por eso honestamente no te lo di, sin embargo, tengo entendido que las expresiones regulares son bastante universales; Express debería analizar sus expresiones de la misma forma que cualquier otro idioma.
Nick Mitchinson
1
Las expresiones regulares son muy poderosas y definitivamente vale la pena aprenderlas. Aquí hay una solución: app.get (/ ^ \ / ((blabla) {0,2}) $ /, function (req, resp) {var matched = req.params [0]; resp .set ('Content- type ',' text / plain ') .send ("Coincidido:'" + coincidente + "'");}); Un par de cosas: 1. las expresiones regulares comienzan y terminan con una /, por lo que cualquier carácter / debe escaparse. 2. El ^ char coincide con el comienzo de la cadena, el $ char coincide con el final de la cadena. Sin ellos, la coincidencia tendrá éxito incluso con caracteres extraños al principio o al final de la ruta, es decir, / x / blablaxxx
John Deighan

Respuestas:

130

Me encontré con esta pregunta mientras buscaba la misma funcionalidad.

@Jonathan Ong mencionó en un comentario anterior que el uso de matrices para rutas está en desuso, pero se describe explícitamente en Express 4 y funciona en Express 3.x. Aquí tienes un ejemplo de algo que puedes probar:

app.get(
    ['/test', '/alternative', '/barcus*', '/farcus/:farcus/', '/hoop(|la|lapoo|lul)/poo'],
    function ( request, response ) {

    }
);

Desde el interior del requestobjeto, con una ruta de /hooplul/poo?bandle=froo&bandle=pee&bof=blarg:

"route": {
    "keys": [
        {
            "optional": false, 
            "name": "farcus"
        }
    ], 
    "callbacks": [
        null
    ], 
    "params": [
        null, 
        null, 
        "lul"
    ], 
    "regexp": {}, 
    "path": [
        "/test", 
        "/alternative", 
        "/barcus*", 
        "/farcus/:farcus/", 
        "/hoop(|la|lapoo|lul)/poo"
    ], 
    "method": "get"
}, 

Tenga en cuenta lo que sucede con los params: conoce los grupos de captura y los params en todas las rutas posibles, se utilicen o no en la solicitud actual.

Por lo tanto, se puede apilar múltiples rutas a través de una matriz fácilmente, pero los efectos secundarios son posiblemente impredecibles si espera obtener algo útil de la ruta que se usó a través de parámetros o grupos de captura. Probablemente sea más útil para la redundancia / aliasing, en cuyo caso funcionará muy bien.

Editar: consulte también la respuesta de @ c24w a continuación .

Edición 2: esta es una respuesta moderadamente popular. Tenga en cuenta que ExpressJS, al igual que la mayoría de las bibliotecas de Node.js, es una fiesta movible. Si bien el enrutamiento anterior todavía funciona (lo estoy usando en este momento, una característica muy útil), no puedo responder por la salida del objeto de solicitud (ciertamente es diferente de lo que he descrito). Pruebe cuidadosamente para asegurarse de obtener los resultados deseados.

Kevin Teljeur
fuente
Funciona de maravilla. Gracias.
OrAssayag
58
app.get('/:var(bla|blabla)?', todo)

:varestablece el req.paramque no usas. solo se usa en este caso para establecer la expresión regular.

(bla|blabla)establece la expresión regular para que coincida, por lo que coincide con las cadenas blay blablah.

?hace que toda la expresión regular sea opcional, por lo que también coincide /.

Jonathan Ong
fuente
1
/bla(bla)?también funciona, pero los parámetros posteriores no se completan correctamente (es decir, /bla(bla)?/:valueno se completan req.params.value). ¿Alguien sabe por qué?
Joscarsson
Si usa express, puede obtenerlo, req.params.varpero debe asegurarse de haber reqpasado a la función
Matt The Ninja
51

De hecho, puede pasar una variedad de rutas , como mencionó, y funciona muy bien:

var a = ['/', '/blabla', '/blablablabla'];
app.get(a, todo);
alex
fuente
28
¿Cuál es el reemplazo de esto que está en desuso?
brandonscript
5
@JonathanOng Dices que esto está desaprobado, y remus pregunta cuál es el reemplazo. ¿Podrías responder a su pregunta?
nbro
router.route (['/ mailer / out / system', '/ mailer / out / payment']) funciona bien en Express 4 sin advertencia de desaprobación
danday74
2
@JonathanOng mirando los documentos actuales de Express v4 usando una matriz no parece estar en desuso.
Jason Axelson
32

Solo para desarrollar la respuesta de Kevin , esto es de los documentos 4.x :

La ruta para la que se invoca la función de middleware; puede ser cualquiera de:

  • Una cadena que representa un camino.
  • Un patrón de ruta.
  • Un patrón de expresión regular para hacer coincidir rutas.
  • Una serie de combinaciones de cualquiera de los anteriores.

Tienen algunos ejemplos , que incluyen:

Esto coincidirá con rutas que empiezan con /abcd, /xyza, /lmn, y /pqr:

app.use(['/abcd', '/xyza', /\/lmn|\/pqr/], function (req, res, next) {
  next();
});
c24w
fuente
11

Fui por un:

['path', 'altPath'].forEach(function(path) {
  app.get(path, function(req, res) { etc. });
});
Augustin Riedinger
fuente
-2

requiera el archivo de su ruta original y defina la nueva ruta así

var user = require('./users');
router.post('/login', user.post('/login'));
Roman Mahrer
fuente