CSV usando MongoDB
Requisitos de la Práctica
A los requisitos de la práctica CSV usando Ajax anterior, le añadimos
Un botón
guardar
. Cuando se hace click en dicho botón se guarda la entrada actual en una base de datos MongoDB.- El
contenido
de la entrada actual se guarda con unnombre
que se solicita previamente al usuario - Usaremos Mongoose para acceder a la base de datos
- El
Sólo se guardan hasta un límite de cuatro ejemplos en la Base de Datos. Cuando el número excede del límite se borra uno de los anteriores y se guarda la nueva entrada
Al igual que en la práctica CSV usando Ajax habrán botones de selección de ejemplo.
- Pondremos tantos botones como registros hay en la Base de Datos.
Al hacer click en uno de estos botones se carga el ejemplo con ese nombre desde la base de datos en la
textarea
de entrada- Para trabajar las rutas que sirven los ejemplos cuando se pulsa uno de los botones de selección de ejemplo se puede usar algo como esto:
// Supongamos que se visita con GET la ruta /mongo/input1 get('/mongo/:ejemplo', function(req, res) { console.log(req.params.ejemplo); /* input1 */ /* ... Consultar la base de datos y retornar contenidos de input1 ... */ });
- Despliegue su aplicación en c9.io. En los enlaces de entrega (
README.md
y taller) especifique la URL de c9.io
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.