callbacks en NodeJS

Hace unos  días os contaba como funcionan los callbacks en JavaScript, y hoy os voy a enseñar un poco del funcionamiento de los callbacks en NodeJS, ya que se suelen utilizar en las operaciones que cuentan con la entrada y salida de datos, siendo algo muy común en su programación.

Por ejemplo, en el siguiente código en el que levantamos un servidor, podemos observar diferentes cosas de las que ya hemos visto, y eso que no hemos visto aun demasiado, desde la llamada a un módulo, a como se realizan los callbacks en nodejs:

var http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('HOLA MUNDO\n');
}).listen(3000, "127.0.0.1");
console.log('Servidor ejecutandose en: http://127.0.0.1:3000/');

Analizando este código vemos que:

  • Línea 1: hace falta módulo http y lo requerimos
  • Línea 2: entregamos los argumentos a http.createServer, que en este caso es una función (el callback) con dos argumentos
  • En las líneas 3 y 4 creamos el documento en el que va a aparecer el texto HOLA MUNDO, cuando ejecutemos la dirección del servidor en un navegador.
  • Línea 6: le decimos el puerto y el hosting que debe de escuchar
  • Línea 7: creamos un mensaje por consola que nos dice donde está ejecutándose el servidor.

De esta forma podemos levantar un servidor, pero esto es solo la punta del iceberg, ya que podemos recoger datos de internet donde es imposible saber cual será el tiempo que tardaremos en recoger la información, sobre todo al atacar diferentes redes y fuentes. Por ello NodeJS que se proclama como una plataforma para crear aplicaciones para redes utiliza los callbacks con el fin de ejecutar acciones cuando ocurra un evento asociado a cada uno (No debemos olvidar que javascript es un lenguaje orientado a eventos)

Este tipo de programación asíncrona, o de no bloqueo, nos permite, por medio de los callbacks en nodejs, hacer que el código no tenga que esperar para ejecutar una acción mientras ejecuta otra, ya que las propias retrollamadas se encargan de que cada acción se realice en el momento oportuno, haciendo que las operaciones no tengan que realizarse una detrás de otra, pudiendo realizarse en paralelo.

El bucle de eventos

NodeJS utiliza el bucle de eventos con el que funciona JavaScript el cual nos permite guardar las funciones callback y ejecutarlas cuando tenga lugar el evento al que están asociadas (Como una conexión a la BBDD o una respuesta desde una consulta HTTP). Al tener guardada la ejecución de la acción, Node puede trabajar ejecutando otras partes del código hasta que se le solicita algunas de las acciones en espera.

Este tipo de programación es como se programó JS, ya que esta preparado para la interacción de un usuario con la web, que puede resultar impredecible para hacer una programación secuencial. De este modo Node aprovecha esta característica para el contexto I/O (Input / Output) y de redes.

Ya que el bucle se basa solamente en un proceso, debemos de seguir varias reglas para optimizar el rendimiento de nuestros scripts:

  • Las funciones deben de regresar rápidamente
  • No pueden bloquear el código
  • Las operaciones que necesiten mucho tiempo se deben de colocar en un proceso independiente.

De este modo cuando un proceso va a tardar mucho tiempo en ejecutarse o en procesar sus datos, no deberíamos utilizar los bucles de eventos.

La estructura del código en NodeJS debe estar desarrollada alrededor de los eventos y no depender de las entradas de datos.