Desarrollo de aplicaciones web

Práctica 6: Utilizando Mongoose

Objetivos

Durante esta práctica, los alumnos serán capaces de:

Esta actividad promueve las siguientes habilidades, valores y actitudes: análisis y síntesis, capacidad de resolver problemas, creatividad, y uso eficiente de la informática y las telecomunicaciones.

Descripción de la actividad

Esta práctica puede ser elaborada de manera individual o en parejas.

Tus archivos fuente de JavaScript deben comenzar con un comentario que contenga el título de la práctica, la fecha y los datos personales de los autores (nombre y matrícula). Por ejemplo:

/*----------------------------------------------------------
 * Práctica 6: Utilizando Mongoose
 * Fecha: 16-Oct-2017
 * Autores:
 *           A01166611 Pepper Pots
 *           A01160611 Anthony Stark
 *----------------------------------------------------------*/


  1. En Cloud9

    Instala MongoDB. Dese la terminal de Cloud9 teclea:

    sudo apt-get update
    sudo apt-get install mongodb-org

    Echa a andar el servidor de MongoDB. Desde la terminal:

    mongod --nojournal

    La última línea de la salida debe contener el siguiente mensaje:

    ... waiting for connections on port 27017

    El servidor de MongoDB deberá mantenerse corriendo en esta terminal mientras se desee utilizar. Para detenerlo, presiona Ctrl-C.


    En Ubuntu nativo

    Instala MongoDB y el paquete de desarrollo de Kerberos (requerido por Mongoose) en tu sistema. Desde la terminal teclea lo siguiente:

    sudo apt-get install mongodb libkrb5-dev

    El servidor de MongoDB queda funcionando después de ser instalado y también cada vez que se reinicie Ubuntu. Los siguientes comandos desde la terminal permiten detener, echar a andar y reiniciar, respectivamente, el servidor de MongoDB:

    sudo service mongodb stop
    sudo service mongodb start
    sudo service mongodb restart
  2. Crea una nueva aplicación web de Express llamada practica6. Esta aplicación será la fachada para una base de datos sobre lenguajes de programación. Teclea en una nueva terminal:

    express -e practica6

    Ejecuta ahora los siguientes comandos en la terminal:

    cd practica6
    npm install

    NOTA: si obtienes un error al correr npm posiblemente requieras anteponerle el comando sudo.

    Ahora instala el módulo de Mongoose:

    npm install mongoose --save
  3. Agrega al final del archivo app.js las siguientes instrucciones para poder establecer una conexión con la base de datos llamada practica6 en el servidor local de MongoDB:

    var mongoose = require('mongoose');
    
    mongoose.connect('mongodb://localhost/practica6');
    
    mongoose.connection.on('open', function () {
      console.log('Connected to Mongoose');
    });
    
    mongoose.connection.on('error', function (err) {
      console.log('Mongoose error. ' + err);
    });
    
  4. Crea el subdirectorio practica6/models y coloca ahí un archivo llamado lenguaje.js con el siguiente contenido:

    // Archivo: practica6/models/lenguaje.js
    
    'use strict';
    
    const mongoose = require('mongoose');
    
    let esquemaLenguaje = mongoose.Schema({
      nombre:   String,
      fecha:    Number, // Año en el que fue creado el lenguaje
      autor:    String
    });
    
    esquemaLenguaje.methods.edad = function () {
      return new Date().getFullYear() - this.fecha;
    };
    
    module.exports = mongoose.model('Lenguaje', esquemaLenguaje);
    

    Este archivo define el esquema de los documentos que se almacenarán en la base de datos. Concretamente se define un modelo llamado Lenguaje que tiene tres campos: nombre, fecha y autor. El modelo también cuenta con un método llamado edad().

    Para utilizar el modelo Lenguaje se debe primero importar el módulo correspondiente. En el código del controlador (routes/index.js):

    'use strict';
    
    const Lenguaje = require(__dirname + '/../models/lenguaje.js');

    Para crear una instancia del modelo:

    let bf = new Lenguaje({ nombre: 'Brainfuck', 
                            fecha: 1993, 
                            autor: 'Urban Müller'});
    

    Para guardar dicha instancia en la base de datos:

    bf.save((err, obj) => {
      if (!err) console.log(obj.nombre + ' ha sido guardado');
    });
    

    Para leer de la base de datos todos los documentos del modelo Lenguaje:

    Lenguaje.find((err, lenguajes) => {
      if (!err) console.log(lenguajes);
    });
    

    La siguiente liga contiene una introducción más completa sobre el uso de Mongoose: Quick Start.

    Verifica desde el shell de MongoDB que la información se esté guardando en la base de datos. Desde la terminal teclea:

    mongo

    Dentro del shell de MongoDB, indica la base de datos que deseas inspeccionar:

    use practica6

    Ahora despliega todos los documentos contenidos en la colección de lenguajes:

    db.lenguajes.find()

    Si deseas conocer un poco más sobre el uso del shell de MongoDB, la siguiente liga es una buena introducción: Getting Started with MongoDB Development.

  5. Agrega el código necesario para completar la aplicación web de tal forma que funcione tal como se describa a continuación.

    Nota:

    Las pantallas que se muestran a continuación son solamente para dar una idea general de su contenido. En tu aplicación deberás utilizar el framework W3.CSS, por lo que se espera que la apariencia de tus pantallas sea significativamente diferente.

    Al acceder desde un navegador con la liga:

    http://nombre-de-tu-servidor-web/

    debe aparecer una página con dos ligas como se muestra aquí:

    Si el usuario selecciona la liga “Dar de alta un nuevo lenguaje”, entonces debe aparecer la siguiente página con un formulario:

    El usuario debe capturar la información solicitada y presionar el botón “Añadir”. En ese momento se debe efectuar una petición de tipo POST que almacene los datos del formulario en la base de datos de MongoDB usando Mongoose. En cuanto se terminen de guardar los datos se debe hacer un redirect a otra página (por ejemplo: res.redirect('/otrapagina')) como la que se muestra aquí:

    Realiza un “reload” de esta página para verificar que se hizo correctamente el redirect. El navegador no debe presentar ninguna ventana de diálogo indicando que se duplicará una petición de tipo POST.

    Usa tu interfaz para capturar los siguientes datos:

    Nombre Fecha Autor
    C 1972 Dennis Ritchie
    C# 2000 Anders Hejlsberg
    C++ 1983 Bjarne Stroustrup
    Clojure 2007 Rich Hickey
    Cobol 1959 Grace Hopper
    Fortran 1957 John Backus
    Go 2009 Rob Pike
    Java 1995 James Gosling
    JavaScript 1995 Brendan Eich
    Lisp 1958 John McCarthy
    Perl 1987 Larry Wall
    Ruby 1995 Yukihiro Matsumoto
    Smalltalk 1972 Alan Kay

    De regreso en el menú principal, si el usuario selecciona la opción “Listar todos los lenguajes”, la página resultante se debe ver así:

    Es importante notar que los lenguajes están ordenados de manera ascendente por edad (la salida anterior fue generada en el año 2013).

  6. Verifica que todas las páginas resultantes sean HTML5 válido utilizando el Servicio de Validación de W3C.

¿Qué se debe entregar?

Escribe el reporte de la práctica tal como se detalla en el documento Reportes de prácticas. El nombre del archivo fuente de AsciiDoctor debe ser reporte_practica6.adoc. A partir del código fuente de AsciiDoctor debes generar el archivo PDF correspondiente. Dicho archivo se debe llamar reporte_practica6.pdf. Coloca estos archivos junto cualquier otro archivo adicional que se requiera para generar el reporte dentro del directorio practica6.

Crea un archivo tarball con todo el contenido del directorio practica6. Nombra a este archivo practica6.tgz. Este archivo se puede crear desde la terminal tecleando lo siguiente (asegúrate que te encuentres en el mismo nivel que el directorio practica6):

tar czf practica6.tgz practica6

Instrucciones para subir archivo

Para entregar el archivo practica6.tgz, ingresa los siguientes datos:

Solicitar NIP

Si la práctica fue desarrollada en pareja, basta que solo uno de los miembros la entregue.

La fecha límite es el lunes 16 de octubre.

Evaluación

Esta actividad será evaluada usando los siguientes criterios:

50% Implementación de los requisitos.
50% Reporte de la práctica de laboratorio.
1 El programa y/o reporte es un plagio.