Os traemos un sencillo artículo para enseñarle a todos aquellos que aún no tienen mucha experiencia con NodeJS como de fácil va a ser crear un Restful API haciendo uso del framework Express y utilizando como base de datos MongoDB.

Requisitos

- Instalación de NodeJS.
- Instalación de MongoDB.
- Conocimientos básicos de JavaScript.


Estructura de nuestra Restful API


Listar colección

GET

http://localhost/api/:coleccion

Obtener un documento de la colección

GET

http://localhost/api/:coleccion/:id

Insertar un documento en la colección

POST

http://localhost/api/:coleccion

Actualizar un documento

PUT

http://localhost/api/:coleccion/:id

Eliminar un documento

DELETE

http://localhost/api/:coleccion/:id

Usamos localhost debido a que el script correrá sobre mi propia máquina y especificamos el puerto 8080. La parte api permanecerá fija para indicar que estamos refiriéndonos a nuestra Restful API y las palabras colección e id se modificarán según nuestras llamadas.

Manos a la obra

Lo primero de todo es crear un directorio el cual contendrá todo nuestro proyecto. Lo llamaremos como queramos. Dentro de este directorio crearemos un archivo llamado package.json el cual contiene información de los módulos que no son necesarios para poder hacer nuestro proyecto. Este archivo JSON debe tener el siguiente aspecto:

package.json

{
    "name": "api-example",   
    "main": "index.js",
    "dependencies": {
        "express": "~4.0.0",
        "mongoskin": "~1.4.12",
        "body-parser": "~1.12.0"
	}
}


Vemos que name es el nombre del proyecto, main es el archivo a ejecutar para iniciar el proyecto y dependencias son los módulos que vamos a usar y sus versiones.

Express: es el framework con el que trabajaremos para crear la Restful API, este framework es muy completo y con él se puede hacer todo tipo de desarrollo web. Para más información acerca de express puedes consultar la página oficial, http://expressjs.com/.
Mongoskin: es un driver para conectar con MongoDB de una manera rápida y sencilla. Existen otros drivers como Mongoose pero Mongoskin es mi favorito por su simplicidad.

Body-Parser: es un módulo para parsear midleware y lo usaremos para poder recibir como objeto los JSON mandados desde el cliente.

Ahora abrimos el terminal y nos situamos dentro del directorio de nuestro proyecto asegurándonos que contiene el archivo package.json que hemos realizado previamente y escribimos el siguiente comando:

npm install

Si diese algún error de permisos, probad con:

sudo npm install

Veremos que se nos ha creado un directorio llamado node_modules que contiene los módulos que hemos instalado como dependencias.

Ahora vamos a crear nuestro index.js y empecemos haciendo la referencia de los módulos.

var express = require("express");
var mongoskin = require("mongoskin"); var bodyParser = require(“body-parser");

A continuación crearemos una variable que será un objeto encargado de controlar el servidor. var app = express();

Vamos a hacer la conexión con MongoDB:

var db = mongoskin.db(“mongodb://@localhost:27017/testdatabase”, {safe:true});
var id = mongoskin.helper.toObjectID;

db es el objeto de conexión e id transformará una cadena en tipo idObject de MongoDB. Ahora es paso de empezar a configurar nuestro Middleware.

Primero haremos tres métodos, el primero para decir los métodos http que aceptamos y el segundo para asegurar con una contraseña nuestra Restful API. Vamos a poner una contraseña común para todos, esto en la práctica no es seguro y lo ideal sería una contraseña o token diferente por usuario con fecha de espiración pero para este ejemplo lo vamos a simplificar de esta forma. El tercer método es para que acepte los parámetros indicados en el header de la petición.

var allowMethods = function(req, res, next) {
    res.header('Access-Control-Allow-Methods', "GET, POST, PUT, DELETE, OPTIONS"); next();
}

var auth = function(req, res, next) {
    if (req.headers.token === "password123456") {
   	 return next();
	}else{
		return next(new Error('No autorizado'));
	}
};

var allowCrossTokenHeader = function(req, res, next) { 
	res.header('Access-Control-Allow-Headers', 'token'); 
	next();
}
Y ahora vamos con el middleware:

app.use(bodyParser.urlencoded({ extended: false })); 
app.use(bodyParser.json());
app.use(allowMethods); 
app.use(allowCrossTokenHeader);

Hemos añadido bodyParser para poder manejar los parámetros que nos lleguen y los métodos de allowMethods y allowCrossTokenHeader.

Ahora vamos a tratar independientemente el parámetro colección en cada petición para asignarlo a una colección de la base de datos.

app.param('coleccion', function(req, res, next, coleccion){ 
    req.collection = db.collection(coleccion);
    return next();
});

Lo que hacemos es usar el método param pasándole como primer valor el nombre del parámetro que debe obtener y hacemos la conexión a esa colección y lo pasamos como valor a req.collection para que esté disponible en las siguientes funciones para poder trabajar con ella.

La función get la usamos para recoger las peticiones GET así como post la usaremos para POST, etc. El primer valor es la ruta de la petición a la que tiene que responder, a partir de ahí son funciones que se le pasan como parámetros que se irán ejecutando una tras otras según vayan llamándose con next(). Como vemos la primera función es auth que la definimos antes y servía para asegurar la API y a siguiente función es la llamada a MongoDB en sí y con res.send() devolvemos los resultados.

app.get('/api/:coleccion', auth, function(req, res, next) { req.collection.find({},{
    limit:10, sort: [['_id',-1]] }).toArray(function(e, results){
        if (e) return next(e);
        res.send(results); 
    });
});

Ahora haremos definimos la misma ruta pero por POST para poder insertar los datos que llegan desde el cliente. En req.body están los datos que recibimos y tal cual nos llega los insertamos y devolvemos el resultado que son los mismo datos más el id generado al insertarse.

if (e) return next(e);
    res.send(results); });
});

Veamos como obtener un documento mediante el id que se le pasa por la url:

app.get('/api/:colecion/:id', auth, function(req, res, next) { req.collection.findOne({
_id: id(req.params.id) }, function(e, result){
if (e) return next(e);
res.send(result);
}); });

Actualizar
app.put('/api/:coleccion/:id', auth, function(req, res, next) {

app.put('/api/:coleccion/:id', auth, function(req, res, next) {
req.collection.update({ _id: id(req.params.id)
}, {$set:req.body}, {safe:true, multi:false}, function(e, result){
if (e) return next(e);
res.send((result === 1) ? {msg:'success'} : {msg:'error'});
}); });

Eliminar

app.delete('/api/:coleccion/:id', auth, function(req, res, next) { req.collection.remove({
_id: id(req.params.id) },
function(e, result){
if (e) return next(e);
res.send((result === 1) ? {msg:'success'} : {msg:'error'});
}); });

Finalmente le ejecutamos el servidor para que escuche en el puerto 8080

app.listen(80, function(){
console.log ('Servidor escuchando en puerto 8080');
});});
Ahora vamos al terminal, al directorio de nuestro proyecto y ejecutamos el siguiente comando node .
Probémoslo

Yo voy a usar Advanced Rest Client, es una aplicación para Chrome con la cual podemos hacer test de nuestro servicio.

Insertando una fruta en la colección frutas

Imagen 0 en Crea un Restful API con NodeJS y MongoDB en 10 minutos


Imagen 1 en Crea un Restful API con NodeJS y MongoDB en 10 minutos

Ahora obteniendo la lista, nos aparecerá la fruta insertada.

Imagen 2 en Crea un Restful API con NodeJS y MongoDB en 10 minutos


Para los nuevos en NodeJS y Express espero que os haya resultado sencillo este artículo. A partir de aquí podríamos ampliar todo lo que queramos nuestra Restful API, añadiendo funcionalidades o refactorizando el código colocando las funciones en otro módulo.

Código: https://github.com/careuno/example-restful-api