Unidad 1 - Introducción A NodeJs
Unidad 1 - Introducción A NodeJs
Unidad 1 - Introducción A NodeJs
Contenido:
NodeJS es una tecnología para el desarrollo de aplicaciones de propósito gene- 1.– Caracteristicas de Node JS 2
ral. Básicamente consiste en una plataforma de ejecución de Javascript, lo que
se conoce como un "runtime", sobre la que se pueden ejecutar todo tipo de pro- 2.– Paquetes de Node JS 4
gramas. 3.– Primeros pasos con Node JS 5
Por decirlo de algún modo sencillo, NodeJS es el lenguaje Javascript sacado 4.– Programación Asíncrona 7
del contexto del navegador. Sus creadores supieron valorar la potencia del len- 5.– Programación orientada a 9
guaje Javascript y usaron el motor "V8" (el motor Javascript open source del 6.– Single Thread (único hilo) 10
navegador Chrome) para crear una plataforma de ejecución capaz de aprove-
7.– El Objeto Process 11
char el popular lenguaje para acometer una gran variedad de proyectos.
PÁGINA 2 NODE JS
1. – Caracteristicas de Node JS
Con NodeJS se pueden construir aplicaciones web tradicionales, como sitios web. De he-
cho, existen diversos proyectos de CMS basados en Node. Sin embargo, el uso más co-
mún de NodeJS es el desarrollo de servicios web que devuelven datos en formato JSON,
lo que llamamos habitualmente API REST. También con Node podemos construir aplica-
ciones de escritorio multiplataforma, compatibles con Windows Linux y Mac, así como pro-
gramas de consola. Muchas herramientas del día a día de los desarrolladores están reali-
zadas usando NodeJS, desde editores como Atom o VSCode, hasta automatizadores de
tareas como Gulp o empaquetadores de assets como Webpack o Rollup.
Node tiene la característica de acometer muchas tareas con poco consumo de recursos,
lo que lo hace especialmente interesante para el desarrollo de servicios de alta concurren-
cia. Node Yei es", tal como se pronuncia NodeJS en inglés, es básicamente un framework
para implementar operaciones de entrada y salida, como decíamos anteriormente. Está
basado en eventos, streams y construido encima del motor de Javascript V8, que es con
el que funciona el Javascript de Google Chrome. A lo largo de este artículo daremos más
detalles, pero de momento nos interesa abrir la mente a un concepto diferente a lo que
podemos conocer, pues NodeJS nos trae una nueva manera de entender Javascript.
De entre alguno de los conceptos que cambian al estar Node.JS del lado del servidor, es-
tá el asunto del "Cross Browser", que indica la necesidad en el lado del cliente de hacer
código que se interprete bien en todos los navegadores. Cuando trabajamos con Node
solamente necesitamos preocuparnos de que el código que escribas se ejecute correcta-
mente en tu servidor. El problema mayor que quizás podamos encontrarnos a la hora de
escribir código es hacerlo de calidad, pues con Javascript existe el habitual problema de
producir lo que se llama "código espagueti", o código de mala calidad que luego es muy
difícil de entender a simple vista y de mantener en el futuro.
Otras de las cosas que deberías tener en cuenta cuando trabajas con NodeJS, que vere-
mos con detalle más adelante, son la programación asíncrona y la programación orienta-
da a eventos, con la particularidad que los eventos en esta plataforma son orientados a
cosas que suceden del lado del servidor y no del lado del cliente como los que conoce-
mos anteriormente en Javascript "común".
PÁGINA 3
Lo que sí queda claro es que NodeJS tiene un footprint de memoria menor. Es decir, los
procesos de NodeJs ocupan niveles de memoria sensiblemente menores que los de otros
lenguajes, por lo que los requisitos de servidor para atender al mismo número de usuarios
son menores. Por aproximar algo, podríamos llegar a tener 1.000 usuarios conectados a
la vez y el proceso de NodeJS ocuparía solamente 5 MB de memoria. Al final, todo esto
se traduce en que empresas grandes pueden tener un ahorro importante en costes de in-
fraestructura. Otros ejemplos, además de LinkedIn son eBay, Microsoft, empresas dedi-
cadas a hosting como Nodester o Nodejitsu, redes sociales como Geekli.st, y muchos
más.
No todo termina con NodeJS, en la actualidad existen diversos proyectos interesantes que
basan su funcionamiento en Node y que nos dan una idea de la madurez que está adqui-
riendo esta plataforma. Es el caso de proyectos como:
Meteor JS: Un framework Open Source para crear aplicaciones web rápidamente, basado
en programación con "Javascript puro" que se ejecuta sobre el motor de Node.JS.
Yeoman: Otra herramienta, esta vez basada en Grunt, que todavía ofrece más utilidades
que ayudan a simplificar diversas tareas en la creación de proyectos, basados en muchas
otras librerías y frameworks habituales como Bootstrap, BackboneJS...
PÁGINA 4 NODE JS
2. – Paquetes de Node JS
$ node
console.log("hola mundo");
Te mostrará el mensaje "hola mundo" en la consola.
Los programas en NodeJS se escriben mediante cualquier editor de texto plano. Cual-
quier editor básico es suficiente, así que cada persona elegirá aquel que prefiera
Generalmente a los archivos Javascript les pondrás extensión ".js", aunque la verdad es
que podrían tener cualquier extensión ya que lo que importa es que tengan texto plano. Lo
colocarás en cualquier carpeta de tu sistema y de momento no necesitamos ninguna es-
tructura de directorios, con tener el archivo suelto será suficiente, aunque más adelante
cuando tengamos nuestras aplicaciones complejas, con sus módulos de dependencias sí
comenzarás a tener una estructura de carpetas bien definida.
El código de nuestro primer programa será tan sencillo como esto:
Veamos algunas cosas mas. Por ejemplo, podríamos complicar nuestro ejercicio para in-
cluir un bucle:
for (var i=0; i<10; i++) {
console.log('hola mundo ' + i);
}
PÁGINA 6 NODE JS
Ahora vamos a ver cómo trabajar con alguna de las funciones básicas del API de Ja-
vascript, como es el caso del setTimeout(), que nos sirve para ejecutar instrucciones con
un retardo expresado en milisegundos.
setTimeout(function() {
console.log('Hola NodeJS');
}, 3000);
Nota: Una función como parámetro enviado a otra función es lo que se conoce habitual-
mente como una función "callback", Esa función anónima (porque no tiene nombre) se
ejecutará solo cuando toque.
Si lo ejecutas verás que tarda 3 segundos antes de mostrar el mensaje "Hola NodeJS".
setInterval(function() {
console.log('Hola NodeJS');
}, 1000);
En este caso verás que tu consola muestra un mensaje cada segundo, dejando el proce-
so abierto. Solo cerrando la ventana del terminal, o bien presionando la combinación de
teclas CTRL+C, o lo que corresponda en tu sistema, se interrumpirá la ejecución del pro-
grama.
Como puedes ver, muchas de las cosas que ya sabes de Javascript se pueden usar en
NodeJS. Solo tienes que llevar en consideración que no estás dentro de un navegador,
por lo que no tendría sentido acceder a objetos del DOM o del navegador en sí, como
"document" o "window".
Algo que tienes en NodeJS a nivel global, parecido a la existencia el objeto "window" en
un navegador, es un objeto "global", del que cuelgan diversas propiedades e incluso mé-
todos como los que acabamos de hacer uso, setTimeout() y setInterval() entre otros.
PÁGINA 7
Ahora que ya sabes que existe ese objeto, la operación de setInterval() la podrías haber
expresado así:
global.setInterval(function() {
console.log('Hola NodeJS con global');
}, 1000);
Con NodeJS tenemos un "Javascript sin restricciones" ya que todo se ejecuta en el servi-
dor y no tenemos que preocuparnos de si nuestro código será compatible o no con distin-
tos clientes. Todo lo que escribas en Node JS y te funcione en tu servidor, estarás seguro
que funcionará bien, sea cual sea el sistema que se conecte, porque toda la ejecución de
código del servidor se queda aislada en el servidor.
Pero no sólo eso, el Javascript original tiene algunas estructuras de control que realmente
no se utilizan en el día a día, pero que realmente existen y están disponibles en NodeJS.
En algunas ocasiones resulta especialmente útil alguna de las mejoras de Javascript en
temas como la herencia.
4. – Programación Asíncrona
ahora toma especial importancia, dado que NodeJS fue pensado desde el primer momen-
to para potenciar los beneficios de la programación asíncrona.
Imaginemos que un programa tiene un fragmento de código que tarda cinco segundos en
resolverse. En la mayoría de los lenguajes de programación precedentes, durante todo
ese tiempo el hilo de ejecución se encuentra ocupado, esperando a que pasen esos cinco
segundos, o los que sea, antes de continuar con las siguientes instrucciones. En la pro-
gramación asíncrona eres capaz de liberar el proceso de modo que los recursos se que-
dan disponibles para hacer otras cosas durante el tiempo de espera.
Un ejemplo claro de esto es una llamada a un servicio web, o una consulta a la base de
datos. Una vez realizada la solicitud generalmente pasará un tiempo hasta que se obten-
ga la respuesta. Ese tiempo, por corto que sea, dejaría un proceso esperando en la pro-
gramación tradicional y en la asíncrona simplemente se libera.
PÁGINA 8 NODE JS
console.log("hola");
fs.readFile("x.txt", function(error, archivo){
console.log("archivo");
})
console.log("ya!");
Realmente Javascript es primeramente síncrono y ejecuta las líneas de código una detrás
de otra. Por ese motivo, como resultado de ejecución del código anterior, primero vere-
mos el mensaje "hola" en la consola, luego el mensaje "ya!" y por último, cuando el fichero
terminó su lectura, veremos el mensaje "archivo".
En Javascript del lado del cliente tenemos objetos como "window" o "document" pero en
Node.JS no existen, pues estamos en el lado del servidor.
Eventos que podremos captar en el servidor serán diferentes, como "uncaughtError", que
se produce cuando se encuentra un error por el cual un proceso ya no pueda continuar. El
evento "data" es cuando vienen datos por un stream. El evento "request" sobre un servi-
dor también se puede detectar y ejecutar cosas cuando se produzca ese evento.
Volvemos a insistir, NodeJS sería un equivalente a PHP, JSP, ASP.NET y entonces todo
lo que sean eventos de Node, serán cosas que ocurran en el lado del servidor, en diferen-
cia con los eventos de Javascript común que son del lado del cliente y ocurren en el nave-
gador.
Nota: La comparación de Node.JS con lenguajes del lado del servidor viene bien para en-
tender cómo pueden sus eventos ser distintos que los de Javascript del lado del cliente.
Sin embargo debemos saber que que Node.JS es más bien una plataforma basada en
Javascript. NodeJS viene con muchas utilidades para programación de propósito general
y para realizar programas que implementarían servidores en sí mismos, por lo que su
equivalente más próximo podría ser algo como Django o Ruby on Rails. Aunque habría
que matizar que esa comparación puede ser un poco atrevida, debido que NodeJS estaría
en un nivel mucho más bajo (más cercano a la máquina) y aunque lo podrías usar sin más
añadidos para el desarrollo de sitios web, se combina con otros frameworks como Ex-
pressJS para dar mayores facilidades para la creación de sitios aplicaciones web.
Una de las primeras cosas que vamos a aprender en NodeJS es trabajar y entender el
proceso de ejecución del programa, que tiene sus particularidades especiales en este len-
guaje. En los capítulos de introducción en el Manual de NodeJS ya hemos abordado algu-
nos conceptos bastante interesantes, pero ahora lo veremos aplicado a código.
PÁGINA 10 NODE JS
7. – El Objeto Process
El objeto process es una variable global disponible en NodeJS que nos ofrece diversas
informaciones y utilidades acerca del proceso que está ejecutando un script Node. Contie-
ne diversos métodos, eventos y propiedades que nos sirven no solo para obtener datos
del proceso actual, sino también para controlarlo.
Nota: El hecho de ser un objeto global quiere decir que lo puedes usar en cualquier locali-
zación de tu código NodeJS, sin tener que hacer el correspondiente require().
Se pueden hacer muchas cosas con el proceso y consultar diversos datos de utilidad. Por
ejemplo, veamos el siguiente código donde podemos examinar información diversa sobre
el proceso actual y la plataforma donde estamos ejecutando este programa:
Básicamente provocará que el programa acabe, incluso en el caso que haya operaciones
asíncronas que no se hayan completado o que se esté escuchando eventos diversos en
el programa.
process.exit(3);
Evento exit
Otra de las cosas básicas que podrás hacer mediante el objeto process es definir eventos
cuando ocurran cosas diversas, por ejemplo la salida del programa.
Los eventos en Javascript se definen de manera estándar mediante el método on(), indi-
cando el tipo de evento que queremos escuchar y una función callback que se ejecutará
cuando ese evento se dispare. Dado que el evento exit pertenece al process, lo definire-
mos a partir de él.
process.on('exit', function(codigo) {
console.log('saliendo del proceso con código de salida', codigo);
})
En este caso la función callback asociada al evento exit recibe aquel código de error que
se puede generar mediante la invocación del método exit() que conocimos en el anterior
punto.
PÁGINA 13