Servidor web con node.js y io.js

Posted by

Qué tal aprendices, un gusto saludarlos. En esta ocasión veremos cómo hacer la configuración básica de un servidor web en node.js.

Imagino que a estas alturas ya la mayoría sabe qué es node.js, pero para los que no, les cuento: node.js es un servidor hecho en javascript, así es, un servidor como apache, tomcat, nginx, etc. Pero hecho con javascript y enfocado a aplicaciones en tiempo real (real-time). Es decir, en un servidor como los antes mencionados, el cliente (dispositivo del usuario) debe estar haciendo peticiones al servidor para verificar cuando haya habido algún cambio. Con node.js no es así, el servidor se encarga de avisar al cliente cuando ha ocurrido una modificación, y esto nos ahorra peticiones al servidor, lo que se traduce en ahorro de recursos. Node.js logra esto gracias a la librería socket.io que permite la comunicación bidireccional entre cliente-servidor.

Otra de las ventajas de node es que tenemos el mismo lenguaje de programación en el cliente y el servidor. Es decir que mientras con otros servidores tenemos javascript del lado del cliente y del lado del servidor php, o java, o python o cualquier otra cosa, con node tenemos javascript en ambos lados. Pero bueno, creo que ya nos estamos saliendo mucho del tema, así que vamos a iniciar.

Instalación

Lo primero que haremos será instalar io.js…. ¡Espera, espera!…. Dijiste que era un servidor en node.

Sí eso dije, pero para esta ocasión usaremos io.js, ¿Por qué?: io.js es una plataforma basada en node.js , la ventaja es que io.js se mantiene al día con las actualizaciones al motor V8, sobre la norma ECMA-262 de JavaScript. Es decir, es node.js + ECMAScript 6. (Pero si prefieren pueden usar solo node).

Si desean más información acerca de cómo funciona io.js con respecto a ECMAScript 6 pueden consultar la entrada oficial o la página de preguntas frecuentes, ambas en español.

Ahora sí, comenzamos. Lo primero es instalar io.js, para eso vamos al sitio oficial o al sitio oficial en español y encontraremos la última versión de io.js para los sistemas operativos más usados y las instrucciones de su instalación. Para quienes usan windows ya se la saben: Siguiente, siguiente, acepto, siguiente y finalizar.

Para verificar la versión de node y npm (node package manager), vamos a la línea de comandos y ejecutamos:

node -v
npm -v

Crear package.json

Para iniciar con nuestro proyecto necesitamos crear el archivo package.json, que contendrá la información de nuestra aplicación. Podemos hacerlo manualmente o utilizando desde la consola el comando:

npm init

El cual nos pedirá cierta información que debe contener el package.js

  • Name: Es el nombre de nuestro proyecto.
  • Version: La versión de nuestro proyecto.
  • Description: Una breve descripción son en qué consiste nuestro proyecto.
  • Entry Point: Archivo principal de nuestro proyecto.
  • Test command: Comando de pruebas en caso que vayamos a usar un suite de pruebas (este no será el caso).
  • Git repository: La ubicación del repositorio en git. Si hemos creado previamente el repositorio automáticamente nos lo detectará.
  • Keywords: Palabras clave de nuestro proyecto.
  • Author: El autor del proyecto.
  • License: El tipo de licencia.

Algunos de los datos tendrán información por defecto, está se mostrará entre paréntesis y es la información que asignará al dato en caso que lo dejemos en blanco.

Luego nos mostrará cómo quedará el archivo package.json y por último damos enter y el archivo package.json será creado en el directorio raíz de nuestro proyecto.

npm init
npm init

Crear archivo principal del servidor

Lo siguiente es crear nuestro archivo principal, con el mismo nombre que especificamos en el package.json, en nuestro caso lo llamaremos ‘server.js’.

Por buenas prácticas, primero agregaremos la línea ‘use strict’, para indicar que codificaremos usando el modo estricto. ¿A qué se refiere esto? Es la forma de especificar que no usaremos malas prácticas en nuestras sentencias, por ejemplo asignar un valor a una variable sin haberla declarado. Javascript usualmente nos deja hacer eso, pero en este caso si lo hacemos nos mostrará una excepción indicando que eso no está permitido.

Luego crearemos una constante para hacer uso del módulo http con la siguiente línea:

const http = require('http');

Si se fijan, la declaré usando ‘const’ y no ‘var’ como se hace usualmente en javascript, esta es una de las funcionalidades de ECMAScript 6, podemos crear variables cuyo valor no podrá ser modificado (constantes). Para quienes usan java, sería lo mismo a crear una variable de tipo ‘final’.

De la misma manera definiremos la constante ‘server’:

const server = http.createServer();

Y le especificaremos el puerto que estará escuchando:

server.listen(8080);

¡Y listo! Ya tenemos un servidor en node que no hace nada. Vamos a probarlo :D, para eso vamos a la consola de comandos, nos posicionamos en la carpeta del proyecto y ejecutamos el comando:

node server.js

Si no nos regresa alguna excepción significa que todo salió conforme lo planeado y nuestro servidor ya está corriendo. Podemos ir a nuestro navegador e ingresar a http://localhost:8080 y no veremos nada. Es genial ¿no? 😀

Bueno, no muestra nada porque nuestro servidor está ahí, pero solo eso, no hace nada más. Así que le especificaremos un mensaje para cuando se le haga una petición y otro para cuando arranca nos diga que ya está corriendo.

La primera forma será pasando una función anónima que recibe dos parámetros, el request y el response al crear el servidor y la segunda cuando se establece el puerto. Quedaría de la siguiente forma:

'use strict'

const http = require('http');
const server = http.createServer(function(req, res)
{
res.end("Hola mundo");
});

server.listen(8080, function()
{
console.log("Servidor escuchando puerto 8080.");
});

Ejecutamos ‘npm server.js’ y nos muestra el mensaje “Servidor escuchando puerto 8080”, luego vamos a http://localhost:8080 y nos muestra “Hola mundo”.

Servidor escuchando puerto 8008
Servidor escuchando puerto 8008
Hola mundo
Hola mundo

Hasta este punto ya tenemos nuestro servidor node configurado en su forma más básica.

Puerto dinámico

En algunos casos, el puerto que asignamos ya está siendo usado por otra aplicación, entonces para finalizar le pasaremos el puerto como parámetro.

Con node podemos acceder a las variables de entorno, por lo que vamos a declarar una constante que almacene el puerto de una variable de entorno o en caso que esta no exista, asignarle uno por defecto. Lo haremos de la siguiente manera:

'use strict'

const http = require('http');
const port = process.env.PORT || 8080;
const server = http.createServer(function(req, res)
{
res.end("Hola mundo");
});

server.listen(port, function()
{
console.log("Servidor escuchando puerto " + port);
});

La constante ‘port’ buscará la variable de entorno ‘PORT’ y en caso de no encontrarla, asignará el puerto 8080 por defecto. Así que si en este punto ejecutamos ‘node server.js’ obtendremos lo siguiente:

Puerto por defecto
Puerto por defecto

Pero si primero creamos la variable de entorno y luego ejecutamos el comando, obtendremos lo siguiente:

Puerto por variable de entorno.
Puerto por variable de entorno.

La forma de declarar variables de entorno, varía dependiendo el sistema operativo. En este caso estoy usando Windows 10.

Hasta aquí la forma de configurar un servidor básico en node.js, en la siguiente entrada veremos los conceptos de callbacks (Que es lo que hicimos para mostrar el mensaje), eventos y el uso de stream en node.

Comments