Primeros Pasos con NodeJS - Creando una API

por Ricardo Vega el 13/04/2016

Hace un par de semanas publicaba el primer artículo donde hablábamos de qué era NodeJS y el uso que le daríamos en el blog. Hoy veremos el primer ejemplo de uso.

Os recuerdo que el otro lenguaje que emplearemos en nuestros proyectos de IoT es Python. Realmente, ambos lenguajes cubren necesidades parecidas, pero nos vamos a aprovechar de las características específicas de cada uno para elegir entre uno u otro según nuestra aplicación.

NodeJS

Así, es muy posible que reservemos Python para tareas de complejo procesado, mientras que utilicemos la rapidez de Node en tareas en tiempo real. Sin embargo, en el ejemplo de hoy vamos a hacer algo semejante a lo que hicimos en el último capítulo de mi curso rápido sobre Python: vamos a crear una API que podamos consumir sencillamente, pero esta vez, los datos ya los tendremos almacenados.

Instalando NodeJS

Sin embargo, antes de nada, vamos a instalar NodeJS. El proceso es muy sencillo y tan sólo tenemos que seguir los pasos que aparecen en la web oficial del proyecto.

En primer lugar, descargamos la versión LTS (Long Time Support) para tu sistema operativo y la instalamos.

En segundo lugar, vamos a una consola (o terminal) y ejecutamos el siguiente comando:

node -v

Deberemos obtener algo semejante a esto:

v4.4.2

Señal de que el proceso de instalación se ha realizado correctamente.

Probamos ahora que el gestor de paquetes (npm), igualmente está instalado de forma adecuada. En este caso, ejecutamos:

npm -v

Y si obtenemos una versión, todo está correcto.

Node y npm

Nota importante para usuarios de Linux (incluidos sistemas embebidos tipo Raspberry Pi): La instalación en sistemas Linux puede hacerse, al igual que ocurre en Windows o OSX, a través del paquete que podemos descargarnos directamente de la página web siguiendo el proceso que he indicado. Sin embargo, te recomiendo que emplees directamente el gestor de paquetes de tu distribución, con lo que dejarás todo preparado para futuras actualizaciones. Voy a poner como ejemplo Debian ya que es una distribución muy popular (y tiene "hijos" muy conocidos también como Ubuntu) y muchos la elegimos también como Sistema Operativo al mando de nuestra Raspberry Pi. Si tienes otra distribución y quieres más información, puedes visitar este enlace.

sudo apt-get install nodejs

Creando una sencilla API

¿Recuerdas la aplicación temperaturaApp que desarrollammos en Pyhton? Vamos a basarnos en ella, empleando para ello NodeJS. Concretamente, vamos a emplear el archivo temperature.db que generábamos con esa aplicación.

Este sencillo fichero no deja de ser una base de datos muy muy sencilla con la siguiente estructura:

  • date: texto con la fecha (formato string)
  • temp_int: número que refleja el valor de la temperatura interior para dicha fecha
  • temp_ext: igual que el anterior, esta vez para la temperatura exterior.

Nuestra API, va a ser una interfaz de acceso a la base de datos, permitiendo un cierto filtrado y devolviendo al usuario un fichero JSON de respuesta.

En Python usábamos una librería llamada Flask para levantar sencillamente una aplicación web. En este caso, en Node vamos a emplear Express. Ambas cumplen propósitos semejantes por lo que sus caracterísiticas son completamente comparables. Puedes leer más sobre Express directamente en la página web de este proyecto OpenSource.

Express

Ahora que sabemos ya qué queremos y cómo lo queremos, procedamos a hacerlo realidad. Creamos un pryecto nuevo. Para ello, ejecutamos los siguientes comandos:

mkdir node-ricveal
cd node-ricveal
npm init

Nota importante: para esta aplicación usaremos el fichero temperature.db como te he comentado, así que tendrás que copiarlo de temperaturaApp a 'node-ricveal/data'

Esto creará una nueva carpeta llamada node-ricveal que será la raiz de nuestro mini-proyecto. Al ejecutar 'npm init' nos preguntarán por una serie de caracterísiticas de nuestro proyecto. Si no quieres liarte demasiado con ello de primeras, te recomiendo aceptes todas las opciones por defecto presionando en cada pregunta.

Al terminar de "interrogarnos", se creará automáticamente un fichero package.json con la información que hemos proporcionado. Éste fichero será el corazón de absolutamente todas las apliaciones NodeJS.

Ahora, es el momento de añadir las dependencias (librerías que vamos a emplear). A parte de la ya mencionada de Express, vamos a usar otra que nos permitirá acceder fácilmente al fichero temperature.db, que no deja de ser una base de datos sqlite3. La librería de la que hablamos, precisamente se llama así, sqlite3.

Añadimos las dependencias:

npm install -s express sqlite3

El '-s' nos guarda en el fichero package.json, dichas dependencias para que podamos contruir de nuevo el proyecto desde cero si queremos sin tener que volver a introducir estos comandos de nuevo. Si nos fijamos, este proceso (que ha tardado un poco) ha creado una nueva carpeta llamada node_modules, donde están alojadas las librerías que emplearemos (y las librerías que éstas necesitan para funcionar).

A partir de este momento, tenemos todo listo para ejecutar nuestra aplicación, aunque antes, tendremos que programarla. Abrimos en Atom u otro editor el fichero index.js y escribimos lo siguiente:

var sqlite3 = require('sqlite3').verbose();
var db = new sqlite3.Database('data/temperature.db');

var express = require('express');
var restapi = express();


restapi.get('/api', function(req, res){
    db.all("SELECT * FROM temperature", function(err, rows){
        res.json({ "data" : rows });
    });
});

restapi.get('/api/fecha/:fecha', function(req, res){
    db.all("SELECT * FROM temperature WHERE date = ?", req.params.fecha, function(err, rows){
        res.json({ "data" : rows });
    });
});

restapi.listen(3000);

console.log("Server lintening on port 3000");

En este sencillo programa vemos cómo se definen dependencias, cómo se crean variables y cómo se emplean las funciones. También estamos haciendo uso de una librería (Express) con sus particularidades que podemos ver en su documentacion específica pero que creo que son fácilmente entendibles tan sólo leyendo el código.

En el primer 'restapi.get' estamos definiendo una función que consulta en base de datos absolutamente toda la información, sin ningún tipo de filtro, mientras que el segundo restapi.get, filtra por fecha.

Guardamos el fichero y ejecutamos:

node .

Así arrancamos la apliación y podemos ver, entrando en el navegador, que se comporta como esperamos. Para ello, entra en estos dos sitios:

  • http:// localhost:3000/api
  • http:// localhost:3000/api/fecha/18:51

Por último, vamos a ver cómo instalar un proyecto que ya existe en vez de crearlo nosotros desde cero.

Cuando descarguemos un proyecto NodeJS, siempre va a tener la misma estructura: un fichero package.json y el resto de cosas. El fichero package.json siempre existirá y en él, como hemos visto está (o debería estar) toda la información necesaria para tener operativo nuestro proyecto. Uno de sus usos, como hemos visto, es definir las librerías necesarias. Vamos a simular que este proyecto lo hemos descargado. Borra la carpeta node_modules y ejecuta de nuevo lo siguiente:

node .

La aplicación no arrancará y te devolverá un error indicándole que le faltan las dependencias necesarias. Pues bien, esta información la tenemos almacenada en package.json. Vamos a hacer uso de ella. Para ello, únicamente necesitamos ejecutar lo siguiente:

npm install

Y a continuación ya podemos volver a ejecutar 'node .' y todo volverá a funcionar como lo hacía antes.

Está claro que esta es una aplicación muy sencilla y no me he parado demasiado en explicarla pero creo que puede servirnos de base para entender un poco la estructura de NodeJS y sus aplicaciones.

Creo que a partir de este punto podemos empezar a construir aplicaciones algo más complejas (y reales). Mi recomendación es que tu mismo montes otra pequeña mini-aplicación con Node para probar si en realidad entiendes su funcionamiento.

La nomenclatura, que no deja de ser javascript, difiere un poco con Python pero los conceptos debajo son los mismos. Aprender Javascript si no lo conoces ya, es una tarea que, aunque no es muy complicada, lleva tiempo; más del que me gustaría dedicar en este blog en principio.

De cualquier forma, si no has entendido este post, no dudes en contactar conmigo y si sois muchos los que os encontráis con dificultades, no tengo ningún problema por ir más despacio y pararme a explicar alguna cosa de Javascript.

Espero que te haya gustado esta entrada. Recuerda compartirla en tus redes sociales.

¡Saludos y hasta la próxima semana!

Apoya al blog


Si te ha gustado este artículo, valora apoyarme económicamente a través de Patreon, una plataforma de Micro-mecenazgo con la que puedes hacerme un donativo que ayude a la continuidad del blog. Una pequeña ayuda significa mucho. 😃

Permanezcamos en contacto!


¿Quieres enterarte de todas las novedades del sector? ¿Te gustaría trabajar conmigo? ¡Puedes contactar conmigo de forma muy sencilla!