post thumbnail

Node.js y Express: Aplicación con MongoDB Parte I

Publicado Por: Oscar González, El 20/01/2014


Detalles del Curso:

Dificultad: Heroe

Duración: 10 min


En el siguiente tutorial voy a enseñar como unir varios temas que tocamos durante la serie para desarrollar una simple aplicación de Express que conecta con MongoDB.

Para entender este tutorial es más que suficiente tener conocimientos superficiales sobre MongoDB. Además también asume que tienes instalada la base de datos en tu sistema y sabes como correrla (y que tiene que estar corriendo cuando hagas node app.js, porque si no va a dar un error horrible). Si no tienes conocimientos sobre esta tecnología, o quieres profundizar más en el tema, mi colega Jonathan Wiesel ha armado una serie bastante completa llamada MongoDB desde Cero que puedes revisar.


Creando el Proyecto

Para este proyecto vamos a utilizar la estructura modular que aprendimos en el tutorial Estructura modular de proyectos. Para esto vamos a clonar el proyecto del repositorio de este tutroial:

// No olvides hacer cd del directorio donde queremos colocar el proyecto. Luego haces el clone...
$ git clone https://github.com/codeheroco/express-proyecto-modular.git

Si quieres puedes cambiar el nombre del proyecto al que quieras. Yo se lo voy a cambiar a express-mongo:

$ mv express-proyecto-modular express-mongo

Instalando dependencias

Primero tenemos que acceder al directorio de nuestro proyecto:

$ cd express-mongo

Y ahora instalamos las dependencias:

$ npm install

Esto instalará Express y Jade en el proyecto.

Para trabajar con MongoDB vamos a utilizar la librería Mongoose. Ésta es un ORM que nos permitirá asociar los registros de la base de datos a objetos dentro de nuestra aplicación.

$ npm install --save mongoose

El parámetro --save permite agregar instantaneamente la dependencia al archivo package.json.


Definiendo los Modelos

En el directorio del proyecto vamos a crear un submódulo llamado models, aquí vamos a definir los objetos de nuestra app y su conexión con la base de datos.

MongoDB es una base de datos "schema-less" o que no utiliza esquema, sin embargo aquí vamos definir uno para hacer un mapa que convierta el resultado de búsqueda de la base datos a los objetos de la aplicación

En la consola escribimos:

// recuerda estar siempre apuntando al directorio de la aplicación
$ mkdir models

Ya tenemos el directorio ahora creemos un modelo (User.js).

// models/User.js

module.exports = function(mongoose) {

  var Schema = mongoose.Schema;

  // Objeto modelo de Mongoose
  var UserSchema = new Schema({

    // Propiedad nombre
    name : String, // tipo de dato cadena de caracteres

    // Propiedad fecha de nacimiento
    birthdate : Date, // tipo de dato fecha

    isAdmin : Boolean // tipo de dato buleano

  });

  // metodo para calcular la edad a partir de la fecha de nacimiento
  UserSchema.methods.age = function() {

    return ~~((Date.now() - this.birthdate) / (31557600000));

  }

  return mongoose.model('User', UserSchema);
}

Esto es un modelo de Mongoose.


Conexión con la base de datos

Dentro de la misma carpeta models vamos a crear un archivo llamado index.js. Este se encargará de conectar con la base de datos y cargar todos los modelos.

// models/index.js
if (!global.hasOwnProperty('db')) {

  var mongoose = require('mongoose');

  var dbName = 'expressTest'

  // the application is executed on the local machine ...
  mongoose.connect('mongodb://localhost/' + dbName);


  global.db = {

    mongoose: mongoose,

    //models
    User:           require('./User')(mongoose),

    // agregar más modelos aquí en caso de haberlos
  };

}

module.exports = global.db;

El objeto global, se encuentra disponible globalmente, como su nombre lo dice. A este objeto se le pueden agregar propiedades como lo hemos hecho en este ejemplo, le agregamos una llamada db, ésta se encargará de llevar una instancia del objeto Mongoose y los modelos de nuestra app.

Para esto funcione tenemos que correr este código cuando inicie nuestra app. Abrimos el archivo app.js y en cualquier parte agregamos require('./models');.


CRUD

Hagamos ahora algunas operaciones sobre el modelo User en los controladores.

En este caso haremos un módulo con un formulario para crear a nuestro usuario.

En el directorio controllers creamos un directorio nuevo llamado users. Dentro creamos un directorio para las vistas y un archivo llamado índex.js para que sea nuestro controlador.

Creando usuarios

En controllers/users/index.js agregamos nuestro codigo usual de todos los controladores:

// controllers/user/index.js

var express = require('express');
var app = module.exports = express();

app.set('views', __dirname + '/views');

Luego procedemos a crear una ruta que muestre un formulario para crear un usuario:

app.get('/user/new', function(request, response) {

  response.render('new');

});

Ahora tenemos que hacer esa vista. En el directorio views del mismo módulo, creamos un archivo llamado new.jade

// controllers/user/views/index.js

h1 Nuevo Usuario

form(method="POST", action="/user")

  p Nombre:
    input(type="text" name="name")

  p Fecha de nacimiento:
    input(type="date" name="birthdate")

  p ¿Es administrador?:
    input(type="check" name="isAdmin")

  p
    button(type="submit") Enviar

Antes de poder probar que se muestre la página tenemos que cargar el módulo en el archivo app.js.

En la sección de módulos agregamos: var user = require('./controllers/user'); y en la sección de rutas agregamos: app.use(user);.

Ahora en la consola corremos mongo y luego nuestra app:

$ mongod &

Y luego:

$ node app.js

Ahora si navegamos a localhost:3000/user/new en un explorador, veremos nuestra página:

Pagina de usuario - Tutorial de node.js, express y mongoDB

Para poder realmente crear un usuario debemos ahora agregar otra ruta a nuestro controlador de usuarios:

app.post('/user', function(request, response) {

  var u = req.body;

  // podemos acceder a DB sin hacer
  // require porque es global
  var newUser = new db.User({
    name: u.name,
    birthdate: u.birthdate,
    isAdmin: u.isAdmin === 'on' ? true : false
  });

  // también podía hacer `new db.User(u)`
  // porque los campos del formulario
  // tienen el mismo nombre del las
  // propiedades del modelo. Para
  // efectos demostrativos aquí cree
  // un objeto con las mismas propiedades
  // y les asigné los valores que vienen
  // del formulario.

  newUser.save(function(error, user) {

    if (error) response.json(error);

    response.redirect('/user');

  }

});

Si llenamos el formulario y hacemos click en enviar, nuestra ruta se encargará de insertar el usurio

Formulario de usuario lleno - Tutorial de node.js, express y mongoDB

Para verificar si se insertó, podemos averiguarlo revisando la consola de mongo:

$ mongo

> use expressTest
> db.users.find().pretty();
{
    "name" : "Oscar",
    "birthdate" : ISODate("1988-02-08T00:00:00Z"),
    "isAdmin" : true,
    "_id" : ObjectId("52dc6e7b1c85c043100fb37a"),
    "__v" : 0
}

Continuará

Vamos a dejarlo hasta aquí por ahora. En el próximos tutorial vamos a crear la ruta /user para que response.redirect('/user'); tenga a donde llevarnos. Hasta ahora solo hemos completado la "C" de CRUD, en la próxima entrada de la serie también te mostraré como hacer el "retreave", "update" y "delete".

Hasta la próxima.


¿Te ha gustado esta publicación?

Compártela:

Por Oscar González

Conoce más sobre este autor aquí


comments powered by Disqus