Sirviendo varias rutas con un solo middleware
En Express es posible servir varias rutas en un sólo middleware
usando la notación :string_sin_dos_puntos
. En ese
caso la correspondiente cadena queda en req.params
:
// Supongamos que se visita con GET la ruta /usuario/pepe
app.get('/usuario/:id', function (req, res) {
console.log(req.params); // { id: "pepe" }
res.send('USUARIO: '+(req.params.id || 'unknown' )); // USUARIO: pepe
});
Cuando se visita /usuario/pepe
el valor de req.params.id
será pepe
.
Es posible también usar una expresión regular para limitar el matching:
// Supongamos que se visita con GET la ruta /mongo/input1.csv
get('/mongo/:ejemplo([a-zA-Z_]\w*\.csv)', function(req, res) {
console.log(req.params.ejemplo); /* input1.csv */
/* ... Consultar la base de datos y retornar contenidos de input1.csv ... */
});
There's another way to do this.
We can execute a function for a specific parameter before a route function executes.
Let's rewrite our previous example using app.param
.
app.param('ejemplo', function (req, res, next, ejemplo) {
if (ejemplo.match(/^[a-z_]\w*\.csv$/i)) {
req.ejemplo = ejemplo;
} else {
next(new Error(`<${ejemplo}> does not match 'ejemplo' requirements`));
/* Error: <input1.csx> does not match 'ejemplo' requirements at app.js:85:12 */
}
next();
});
// Supongamos que se visita con GET la ruta /mongo/input1.csv
app.get('/mongo/:ejemplo', function(req, res) {
console.log(req.params.ejemplo); /* input1.csv */
console.log(req.ejemplo); /* input1.csv */
/* ... Consultar la base de datos y retornar contenidos de input1.csv ... */
});
app.param
is an amazing function and can be really handy for checking or parsing parameters.Remember to pass the parameter as 4th function parameter though!
next()
is a function passed as third parameter to a route / param function.- When executed it will take you to the next middleware / route.
- If you give
next
a parameter such asnew Error()
or just a string, it will show the user an error.
Para mas detalles sobre routing estudie los ejemplos de routing en Express en este repo.