Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 13

ADMINISTRACIÓN DE SISTEMAS INFORMÁTICOS

Unidad 1 - Introducción a nodejs

Implantación de Aplicaciones Web

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.

Si queremos entender esta plataforma, lo primero que debemos de hacer es desprender-


nos de varias ideas que los desarrolladores de Javascript hemos cristalizado a lo largo de
los años que llevamos usando ese lenguaje. Para empezar, NodeJS se programa del lado
del servidor, lo que indica que los procesos para el desarrollo de software en "Node" se
realizan de una manera muy diferente que los de Javascript del lado del cliente.

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

Además, NodeJS implementa los protocolos de comunicaciones en redes más habituales,


de los usados en Internet, como puede ser el HTTP, DNS, TLS, SSL, etc. Mención espe-
cial al protocolo SPDY, fácilmente implementado en Node, que ha sido desarrollado ma-
yoritariamente por Google y que pretende modernizar el protocolo HTTP, creando un sis-
tema de comunicaciones que es sensiblemente más rápido que el antiguo HTTP (apuntan
un rendimiento 64% superior).
Existen varios ejemplos de sitios y empresas que ya están usando Node en sitios en pro-
ducción y algunos casos de éxito que son realmente representativos. Quizás el más co-
mentando sea el de LinkedIn, la plataforma de contacto entre profesionales a modo de red
social. Al pasar a NodeJS, LindkedIn ha reducido sensiblemente el número de servidores
que tenían en funcionamiento para dar servicio a sus usuarios, específicamente de 30
servidores a 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.

Grunt: Un conjunto de herramientas que te ayudan como desarrollador web Javascript.


Minifica archivos, los verifica, los organiza, etc. Todo basado en línea de comandos.

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

Algunos de los más populares hoy en día son módulos de NPM:

express - Express.js, inspirado en el framework de desarrollo web para Node.js, y el es-


tándar de facto para la mayoría de aplicaciones Node.js de hoy en día.
connect - Connect es un servidor HTTP extensible framework para Node.js, que propor-
ciona una colección de alto rendimiento de plugins conocidos como middleware; sirve co-
mo fundamento para expresar.
socket.io y sockjs - Componente del servidor de los dos componentes de websockets
más comúnes en la actualidad.
Jade - Uno de los más populares motores de plantillas, inspirados por HAML, un defec-
to en Express.js.
mongo y mongojs - mongoDB wrappers para proporcionar la API para bases de datos
de objetos MongoDB en Node.js.
redis - Redis biblioteca cliente.
coffee-script - CoffeeScript compilador que permite a los desarrolladores escribir sus
programas Node.js con café.
Underscore (lodash, lazy) - La biblioteca de utilidades más popular de JavaScript, em-
paquetados para ser utilizado con Node.js, así como sus dos contrapartes, que prometen
mejorar el rendimiento mediante la adopción de un enfoque de aplicación ligeramente di-
ferente.
forever - Probablemente la utilidad más común para asegurar que un determinado No-
de script se ejecuta continuamente. Mantiene su proceso de Node.js en la producción y en
el rostro de cualquier fallo inesperado
PÁGINA 5

3. – Primeros pasos con Node JS

En NodeJS la consola de Node puedes escribir instrucciones Javascript. Si lo deseas,


puedes mandar mensajes a la consola con console.log() por lo que ésta podría ser una
bonita instrucción para comenzar con node:

$ 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:

console.log('hola mundo Node!');


Nos situamos en la carpeta donde hemos colocado el archivo "holamundo.js".
cd ruta/del/proyecto
Luego lanzamos el proceso de NodeJS indicando el nombre del archivo que vas a ejecu-
tar:
node holamundo.js

No vamos a entrar en muchos detalles de sintaxis pues es la misma sintaxis JavaScript


que conoces del curso anterior

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".

Parecido a setTimeout() tenemos setInterval() que ejecuta un código cada un intervalo de


tiempo, también en milisegundos.

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

Puedes hacer un console.log() del objeto global para ver su contenido.


console.log(global);

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.

Éste es un concepto que algunas personas no consiguen entender a la primera y que

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

En NodeJS, o en Javascript en general, cuando esa espera ha terminado y se ha recibido


la respuesta, se retomará la ejecución del código. Para definir las acciones a realizar
(código a ejecutar) cuando se haya terminado esa espera, se especifica el código median-
te funciones llamadas habitualmente "callbacks". Esas funciones contendrán las líneas de
código que ejecutar al final de esos procesos de espera, y una vez se ha recibido la res-
puesta.
La filosofía detrás de Node.JS es hacer programas que no bloqueen la línea de ejecución
de código con respecto a entradas y salidas, de modo que los ciclos de procesamiento se
queden disponibles durante la espera. Por eso todas las APIs de NodeJS usan callbacks
de manera intensiva para definir las acciones a ejecutar después de cada operación I/O,
que se procesan cuando las entradas o salidas se han completado.
Por ejemplo miremos este código:

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".

Por la forma de ejecutarse el código se puede entender la programación asíncrona. La


segunda instrucción (que hace la lectura del archivo) tarda un rato en ejecutarse y en ella
indicamos además una función con un console.log ("archivo"), esa es la función callback
que se ejecutará solamente cuando termine la lectura del archivo. Por ese detalle, lo últi-
mo que aparecerá en pantalla es el contenido del fichero. Este detalle es de extrema im-
portancia para entender la programación con NodeJS.
PÁGINA 9

5. – Programación orientada a eventos (POE)

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

6. – Single Thread (único hilo)

Una de las características de NodeJS es su naturaleza "Single Thread". Cuando pones en


marcha un programa escrito en NodeJS se dispone de un único hilo de ejecución.
Esto, en contraposición con otros lenguajes de programación como Java, PHP o Ruby,
donde cada solicitud se atiende en un nuevo proceso, tiene sus ventajas. Una de ellas es
que permite atender mayor demanda con menos recursos, uno de los puntos a favor de
NodeJS.
Para conseguir que la programación Single Thread de NodeJS pueda producir resultados
satisfactorios debemos entender su característica no bloqueante, que abordamos al ha-
blar de la programación asíncrona en el artículo de las características de NodeJS. En re-
sumen, todas las operaciones que NodeJS no puede realizar al instante, liberan el proce-
so se libera para atender otras solicitudes. Pero como hemos dicho en este artículo nos
proponemos aterrizar estas ideas en algo de código que nos permita ir aprendiendo cosas
nuevas de NodeJS.
Nota: Cabe aclarar que el single thread no implica que Node no pueda disponer de varios
hilos de manera interna para resolver sus problemas. Es decir, nuestro hilo principal por
ejemplo cuando estamos desarrollando un servidor con Node podrá estar atento a solicitu-
des, pero una vez que se atiendan, Node podrá levantar de manera interna otros proce-
sos para realizar todo tipo de acciones que se deban producir como respuesta a esas soli-
citudes. También será posible si lo deseamos disponer de diversos programas ejecutados
en procesos distintos, o clones de un mismo proceso para atender diversas solicitudes
más rápidamente.
PÁGINA 11

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().

En la documentación de Node encuentras todo lo que hay en este objeto process:


https://nodejs.org/docs/latest/api/process.html
Nota: La documentación de NodeJS está organizada por versiones de la plataforma. El
link anterior te dirige a la última versión del API de Node, pero tú deberías consultar los
docs de la versión con la que estés trabajando. No obstante, el estado del API para el ob-
jeto process está definido desde hace mucho tiempo y difícilmente cambiará.
Consultar datos del proceso

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:

console.log('id del proceso: ', process.pid);


console.log('título del proceso: ', process.title);
console.log('versión de node: ', process.version);
console.log('sistema operativo: ', process.platform);

A veces podemos necesitar salir inmediatamente de la ejecución de un programa en No-


deJS. Esto lo podemos conseguir mediante la invocaciónn del método exit() del objeto
process.
process.exit();

Nota: El comportamiento normal de un programa será salir automáticamente cuando haya


terminado su trabajo. Técnicamente esto quiere decir, que se haya terminado la secuen-
cia de ejecución de instrucciones de un script y que no haya trabajo pendiente en el
"event loop". Sobre el bucle de eventos hablamos en el artículo de los eventos en Node.
PÁGINA 12 NODE JS

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.

El método exit puede recibir opcionalmente un código de salida. Si no indicamos nada se


entiende "0" como código de salida.

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

También podría gustarte