Node, Express y MongoDB: Crea un API REST en JavaScript server-side de forma rápida, sencilla y eficiente
Índice
Introducción
¿Quieres construir un API REST de forma rápida, sencilla y con un alto rendimiento? Esta es tu combinación: NodeJS, Express y MongoDB.
En este tutorial aprenderás los conceptos básicos de estas tecnologías y frameworks, que te ayudarán a construir una arquitectura robusta para desarrollar un API REST sobre JavaScript en la parte servidora.
¿Por qué JavaScript? A medida que los motores JavaScript se han hecho más y más eficientes, especialmente desde la aparición del motor V8 desarrollado por Google y su compilador JIT a código nativo,
JavaScript se ha convertido en una alternativa cada vez más extendida de la nueva generación de aplicaciones web, no sólo en la parte cliente sino en la parte servidora, gracias también a los motores
JavaScript tipo RingoJS o NodeJS, basados respectivamente en las implementaciones de ECMAScript Rhino, de Mozilla y V8 de Google.
Manos a la obra
Para seguir este tutorial necesitas:
- NodeJS: Es una plataforma basada en el runtime JavaScript de Google Chrome, sigue un modelo de entrada/salida orientado a eventos y no bloqueante, de ahí su eficiencia. La arquitectura de NodeJS consiste en
un hilo principal sirviendo a todos los usuarios y una serie de hilos para realizar operaciones de entrada/salida de forma asíncrona, con lo que la conexión del cliente (o el hilo principal de ejecución) no está
asociado a los hilos de entrada/salida, optimizando los recursos del sistema que lo alberga (NodeJS). - Express: Es un framework para construir aplicaciones web sobre NodeJS inspirado en el framework Sinatra de Ruby (Express).
- Mongoose: Se trata de un ODM (Object Data Mapper) en JavaScript diseñado para aplicaciones que usen MongoDB sobre NodeJS. Posee un API intuitivo
para definir los modelos de datos y el almacenamiento asíncrono (Mongoose ODM). - MongoDB: Es una base de datos opensource NoSQL, destaca por su alto rendimiento y escalabilidad. Es orientada a documentos de estilo JSON y posee características
interesantes como el Auto-Sharding o alta disponibilidad y replicación entre otras (MongoDB).
Una vez instalado NodeJS y MongoDB (recomiendo usar una cliente con un interfaz gráfico para MongoDB),
crearemos un directorio para el proyecto y en su raíz, el fichero package.json que definirá el paquete npm que crearemos para construir el proyecto. Dicho fichero
contiene metadatos del propio proyecto, así como las dependencias con otras librerías:
{ "name": "node-express-mongoose-rest-sampleapp", "version": "0.0.1", "scripts": { "start": "node app" }, "dependencies": { "express": "*", "mongoose":"*" } }
Mediante esta definición, declaramos las dependencias con las librerías Express y Mongoose que usaremos para construir nuestro API REST. Una vez creado el fichero ejecutaremos
el comando npm install en el mismo directorio donde tenemos el fichero package.json, instalándose de forma local los paquetes Express y Mongoose para NodeJS.
Con esto ya tenemos todo lo necesario para empezar nuestra aplicación. Comenzaremos creando en la raiz de nuestro proyecto el fichero app.js, que previamente hemos definido en el fichero package.json
como el JavaScript principal a ejecutar por node.
//Load app dependencies var express = require('express'), mongoose = require('mongoose'), http = require('http'); var app = express(); //Configure: bodyParser to parse JSON data // methodOverride to implement custom HTTP methods // router to crete custom routes app.configure(function(){ app.use(express.bodyParser()); app.use(express.methodOverride()); app.use(app.router); }); app.configure('development', function(){ app.use(express.errorHandler()); }); //Sample routes are in a separate module, just for keep the code clean routes = require('./routes/router')(app); //Connect to the MongoDB test database mongoose.connect('mongodb://localhost/test_database'); //Start the server http.createServer(app).listen(8080);
La base de datos que usaremos (en el ejemplo test_database) se creará en MongoDB una vez iniciemos la aplicación.
Ahora crearemos una definión del recurso que expondremos en nuestro API REST, en el ejemplo crearemos un esquema Person en el fichero models/person.js y
lo exportaremos como un modelo Mongoose en NodeJS:
//Sample Mongoose Schema (Person class) var mongoose = require('mongoose'), Schema = mongoose.Schema; var personSchema = new Schema({ name: String, lastName: String }); //Export the schema module.exports = mongoose.model('Person', personSchema);
Nuestro modelo Person contiene dos atributos, nombre y apellido definidos en un esquema Mongoose.
Por último, necesitamos enlazar las operaciones sobre el recurso Person con los métodos HTTP. Esto lo haremos creando un router de Express en el fichero routes/router.js:
//App routes module.exports = function(app){ var Person = require('../models/person'); //Create a new Person and save it person = function(req, res){ var person = new Person({name: req.body.name, lastName: req.body.lastName}); person.save(); res.end(); }; //find all people list = function(req, res){ Person.find(function(err, people) { res.send(people); }); }; //find person by id find = (function(req, res) { Person.findOne({_id: req.params.id}, function(error, person) { res.send(person); }) }); //Link routes and functions app.post('/person', person); app.get('/person', list); app.get('/person/:id', find);
En este caso nuestro API tendrá tres operaciones sobre nuestro recurso Persona:
- Creación de nueva persona: POST /person
- Listado de personas: GET /person
- Lista de persona por Id: GET/person/:id
Una vez creadas las operaciones, podremos iniciar nuestra aplicación, para ello levantaremos MongoDB y cargaremos el fichero app.js en NodeJS usando
el comando node app.js. Nuestra aplicación levanta un servidor HTTP escuchando en el puerto 8080 y que ejecutará las operaciones según nuestro router
recien creado.
Para probar nuestro API REST usaremos REST Console, un plugin de Chrome muy completo para depurar las llamadas al API.
Para crear una nueva Persona haremos una llamada POST /person con los siguientes datos:
Si la creación del nuevo recurso Persona ha ido bien obtendremos un código HTTP 200 OK:
Para consultar los recursos creados usaremos GET /person:
Esta consulta retornará una colección de personas, en este caso dos, con sus respectivos identificadores que usaremos en la siguiente consulta.
Para obtener un recurso por id haremos una llamada GET /person/:id. Por ejemplo: GET /person/509f7ea9b6ff443202000003
Obteniendo el recurso solicitado:
Si queremos consultar o realizar otras operaciones directamente en MongoDB sobre los recursos creados, podemos usar el shell usando el siguiente comando
mongo localhost/test_database para después hacer, por ejemplo, una consulta a la coleccion de Persona creada:
Conclusiones
NodeJS, Express y MongoDB es una buena combinación para construir un API REST de forma sencilla, rápida y eficiente en un entorno escalable. La modularización
del estándar CommonJS soportada por NodeJS permite construir código bien organizado. El framework Express nos facilita la tarea de construir un patrón MVC
sobre NodeJS. MongoDB, mediante el ODM Mongoose, nos proporciona una forma muy intuitiva de almacenar y consultar los documentos JSON.
Hola Paulino.
Aunque si ha leido al respecto, desconozco Express y NodeJS.
¿Son compatibles de alguna forma todos los frameworks ya existentes ya desarrollado como por ejemplo: Spring Core (IoC), Spring Security, Spring Security OAuth2 y los otros muchos ya existentes o hay que usar otras alternativas?
¿Existen ya esas alternativas?
¿Conoces algún motivo por las que tengamos que usar estas tecnologías en vez de JEE?
Digo JEE, por que adictosaltrabajo.com está centrado en Java.
Gracias
Hola Carlos,
En cuanto a la compatibilidad que dices, los frameworks que comentas son basados en tecnologías Java por lo que no pueden ser ejecutados en NodeJS. Lo que si existen son alternativas para esas implementaciones como por ejemplo para oAuth2 en Javascript server-side.
En cuanto a la IoC, NodeJS está basado en un patrón modulo, recordemos que Javascript es un lenguaje debilmente tipado, lo cual, entre sus ventajas tiene que no sea obligatorio tener constructores, ni tampoco reflection ya que puedo cambiar las propiedades de un objeto en tiempo de ejecución y sustituirlo por una diferentes funciones por ejemplo, no siendo necesaria la IoC, aun así, si existen implementaciones sobre NodeJS de contenedores IoC tipo Spring.
Tambien destacar que NodeJS no es un servidor, sino un motor o maquina virtual Javascript (basada en la especificación ECMAScript) sobre el que se pueden construir, a igual que con la JVM, cualquier tipo de aplicación.
Es otra alternativa a tener en cuenta. JEE tiene una cantidad de librerías para el entorno empresarial muy amplia y extendida, pero Javascript puede ser una buena alternativa para ciertos desarrollos, y tiene la ventaja de usar el mismo lenguaje tanto para la parte cliente y parte servidora. Incluso una aplicación construida en javascript podría correr en un browser en cliente o en un VM como NodeJS en la parte servidora sin cambiar practicamente nada.
También es importante tener en cuenta que Javascript es un lenguaje muy extendido ya que en cada navegador tenemos un motor que lo interpreta, por eso me alegro que adictosaltrabajo.com se abra a nuevas tecnologías no solo centradas en Java como ya se ha hecho por ejemplo en los desarrollos nativos en iOS o Android.
Gracias Paulino.
Ya me queda más claro.
Un saludo
No se si estaré equivocado, pero aparte de reutilizar nuestros conocimientos en javascript, al utilizar NodeJS podemos conseguir aplicaciones en tiempo real no?. Hasta donde tengo conocimientos este mismo tipo de aplicaciones pueden ser logradas mediante frameworks del tipo Atmosphere para tecnologías java no?