En la entrada de hoy, vamos a profundizar un poco más en la creación de web services con Node JS + Express. Hemos seleccionado Node basándonos en lo detallado en nuestra entrada anterior, donde hablábamos acerca de porqué es recomendable utilizar Node para la creación de servicios web. La dificultad de este ejercicio es muy baja ya que está pensado para que empecemos a entender cómo utilizar Node JS en servicios web. Para simplificar mucho el código fuente, hemos seleccionado resultados demo de JSON obtenido por URL y de este modo evitar consultas a base de datos. Pero no os preocupéis si este es vuestro objetivo ya que también lo veremos en futuros artículos. Pongámonos entonces ‘manos a la obra’.
Índice
Instalación del entorno de desarrollo.
Lo primero que debemos hacer es preparar nuestro entorno de desarrollo, voy a dar por hecho que es la primera vez que decides hacer uso de tecnología Node JS. Por lo tanto, vamos a empezar con la instalación accediendo a la página oficial: https://nodejs.org/en/download/. Una vez aquí, selecciona tu sistema operativo y descarga el binario.
Vamos ahora a comprobar las versiones de Node JS y de NPM (Gestor de paquetes). Tras haber instalado Node JS, vamos a comprobar las versiones instaladas en nuestra máquina. Para ello, abrimos una shell o ventana de símbolo de sistema y una vez en ella tecleamos lo siguiente:
node -v npm -v
Con node -v comprobamos la versión de Node JS que hemos instalado en nuestro equipo, con el comando npm -v realizamos la misma acción, pero en esta ocasión sobre el gestor de paquetes. El resultado esperado tras cada ejecución de comando será algo similar a esto.
¿Qué es NPM y para que se utiliza?
Al igual que en PHP disponemos de composer como instalador de paquetes, Node JS dispone de su propio instalador: npm. El comportamiento de este es exactamente el mismo que el de cualquier otro y su uso es muy sencillo. Sin embargo, la potencia que tiene es muy alta. A continuación veremos qué es y cómo importar el módulo Express desde npm.
Funcionalidades del módulo Express de Node.
Tal y como en su página web se detalla, cito:
Express es un framework web transigente, escrito en JavaScript y alojado dentro del entorno de ejecución NodeJS. El modulo explica algunos de los beneficios clave de este framework, como configurar tu entorno de desarrollo y como realizar tareas comunes en desarrollo y publicación web.
A pesar de que Express es en sí mismo bastante minimalista, los desarrolladores han creado paquetes de middleware compatibles para abordar casi cualquier problema de desarrollo web. Hay librerías para trabajar con cookies, sesiones, inicios de sesión de usuario, parámetros URL, datos POST, cabeceras de seguridad y muchos más. Puedes encontrar una lista de paquetes middleware mantenida por el equipo de Express en Express Middleware (junto con una lista de algunos de los paquetes más populares de terceros). Podemos decir a día de hoy, que Express es el framework web más popular de Node, y es la librería subyacente para un gran número de otros frameworks web (siempre hablando dentro de Node JS). Gracias a este módulo, podemos disfrutar de las siguientes ventajas:
- Escritura de manejadores de peticiones con diferentes verbos HTTP en diferentes caminos URL (rutas).
- Integración con motores de renderización de «vistas» para generar respuestas mediante la introducción de datos en plantillas.
- Establecer ajustes de aplicaciones web como qué puerto usar para conectar, y la localización de las plantillas que se utilizan para renderizar la respuesta.
- Añadir procesamiento de peticiones «middleware» adicional en cualquier punto dentro de la tubería de manejo de la petición.
Nota: Esta información acerca de Express, ha sido obtenida de la página oficial.
¿Cómo instalar el módulo Express con npm?
Ahora abre consola y ve al directorio que hemos creado para nuestro proyecto, en mi caso /apirest. Una vez estemos en el, vamos a ejecutar la siguiente línea de comandos: npm install express.
Si accedemos desde nuestro IDE de desarrollo favorito (en mi caso sublime text) y abrimos el proyecto que creamos inicialmente, vemos que se ha añadido un directorio interno llamado node_modules. Entiendo que hasta aquí todo es muy fácil y llevadero, continuemos entonces.
Instalando el módulo Request: recuperar contenido de URL.
Ahora vamos a instalar otro paquete o módulo que nos ofrece Node JS, en esta ocasión se trata de un módulo que nos permite recuperar y tratar datos obtenidos como cuerpo de una URL. En nuestro caso, como comenté al principio de la entrada y para facilitar el ejercicio consumiremos datos JSON de una URL con contenido demo.
La URL que vamos a consumir es la siguiente: https://jsonplaceholder.typicode.com/todos No os preocupéis por el momento, seguidamente veremos como tratar esta información.
Creando nuestros primeros web services con Node JS + Express.
Ha llegado el momento de empezar a tratar el código fuente, empecemos creando un script al mismo nivel donde tenemos el directorio node_modules y el script package-lock.json, y lo vamos a llamar application.js Será aquí en application.js donde vamos a crear la siguiente lógica.
// Carga de modulos necesarios y creación de nueva aplicacion. var express = require("express"); var app = express(); var bodyParser = require('body-parser'); var request = require("request"); // URL con contenido JSON demostrativo. var url = "https://jsonplaceholder.typicode.com/todos/" // Soporte para bodies codificados en jsonsupport. app.use(bodyParser.json()); // Soporte para bodies codificados app.use(bodyParser.urlencoded({ extended: true })); // Ejemplo: GET http://localhost:8080/users // Consumimos datos Facke de la URL: https://jsonplaceholder.typicode.com/todos app.get('/users', function(req, res) { request({ url: url, json: false }, function (error, response, body) { if (!error && response.statusCode === 200) { // Pintamos la respuesta JSON en navegador. res.send(body) } }) }); //Ejemplo: GET http://localhost:8080/items/3 app.get('/users/:id', function(req, res) { var itemId = req.params.id; request({ url: url+itemId, json: false }, function (error, response, body) { if (!error && response.statusCode === 200) { // Pintamos la respuesta JSON en navegador. res.send(body) } }) }) var server = app.listen(8888, function () { console.log('Server is running..'); });
Para hacer correr nuestra aplicación, deberemos ejecutar el siguiente comando en consola.
node application.js
Recordemos cargar la URL en navegador con el puerto que le hemos asignado para visualizar el contenido. http://localhost:8888/users/
Explicación del funcionamiento.
Bien, ya habéis podido comprobar que tenemos nuestra aplicación lista y funcionando. También hemos visto con la sencillez que hemos creado estos webservices estáticos, de todos modos vamos a explicar el funcionamiento de la misma. Lo que hacemos inicialmente no tiene mucho misterio, es cargar las librerías y una URL en una variable.
// Carga de modulos necesarios y creación de nueva aplicacion. var express = require("express"); var app = express(); var bodyParser = require('body-parser'); var request = require("request"); // URL con contenido JSON demostrativo. var url = "https://jsonplaceholder.typicode.com/todos/"
A continuación, estamos haciendo uso de funciones que nos ofrece el módulo Express, y lo que conseguimos con ello es poder leer el cuerpo de una página y poder almacenar este en un JSON. Realmente, si hubieramos obtenido los datos directamente mediante consultas SQL, esto no sería necesario.
// Soporte para bodies codificados en jsonsupport. app.use(bodyParser.json()); // Soporte para bodies codificados app.use(bodyParser.urlencoded({ extended: true }));
Si continuamos avanzando por el código, vemos que esperamos 2 rutas GET y cada una de ellas lanza una función. Realmente esto podía haber quedado abreviado, pero he preferido que sea más visual que funcional ya que la finalidad es una buena comprensión. La primera de las llamadas: app.get(‘/users’, function(req, res) se limita a recuperar todos los datos sin ningún tipo de filtrado, en cambio, la segunda: app.get(‘/users/:id’, function(req, res) al tener un parámetro variable :id, lo que nos está indicando es que le podemos pasar un parámetro adicional en navegador y este será interpretado a nivel de filtrado. Notemos que la única diferencia entre ambas llamadas es la recuperación de este parámetro variable: var itemId = req.params.id; y a su vez, su inclusión en la llamada URL: url: url+itemId,
// Ejemplo: GET http://localhost:8080/users // Consumimos datos Facke de la URL: https://jsonplaceholder.typicode.com/todos app.get('/users', function(req, res) { request({ url: url, json: false }, function (error, response, body) { if (!error && response.statusCode === 200) { // Pintamos la respuesta JSON en navegador. res.send(body) } }) }); //Ejemplo: GET http://localhost:8080/items/3 app.get('/users/:id', function(req, res) { var itemId = req.params.id; request({ url: url+itemId, json: false }, function (error, response, body) { if (!error && response.statusCode === 200) { // Pintamos la respuesta JSON en navegador. res.send(body) } }) })
El ‘pistoletazo de salida’ o lanzamiento de la aplicación se muestra el último fragmento de código, donde se define el puerto y ofrecemos un mensaje en consola para que se sepa que el servidor ha sido lanzado.
var server = app.listen(8888, function () { console.log('Server is running..'); });
Como he dicho al principio del artículo, este es un ejemplo muy básico de servicios web con Node JS. Pero estoy seguro de que a más de uno le puede servir para adentrarse en este mundo tan chulo que la programación nos ofrece y para mejorar el análisis en futuras aplicaciones. Versiones utilizadas, tiempo y dificultad de desarrollo: Plataforma: NodeJS 8.12.0 Instalador NPM: 6.4.1 Dificultad: Iniciación. Y recuerda, si te gustó la entrada y quieres estar al día acerca de estos temas, no olvides suscribirte al blog.