Node JS
Node JS
Node JS
http://desarrolloweb.com/manuales/manual-nodejs.html Página 1 de 51
Manual de NodeJS
Manual donde a lo largo de diversos capítulos iremos viendo como trabajar con NodeJS, una
plataforma para el desarrollo de aplicaciones de propósito general con Javascript como
lenguaje.
Podemos decir que NodeJS es una tecnología que se apoya en el motor de Javascript V8 para
permitir la ejecución de programas hechos en Javascript en un ámbito independiente del
navegador. A veces se hace referencia a NodeJS como Javascript del lado del servidor, pero es
mucho más.
La característica más importante de NodeJS, y que ahora otra serie de lenguajes están
aplicando, es la de no ser bloqueante. Es decir, si durante la ejecución de un programa hay
partes que necesitan un tiempo para producirse la respuesta, NodeJS no para la ejecución del
programa esperando que esa parte acabe, sino que continúa procesando las siguientes
instrucciones. Cuando el proceso lento termina, entonces realiza las instrucciones que fueran
definidas para realizar con los resultados recibidos.
Esa característica, y otras que veremos en el Manual de NodeJS hace que el lenguaje sea muy
rápido.
http://desarrolloweb.com/manuales/manual-nodejs.html Página 2 de 51
Manual de NodeJS
Las siguientes personas han participado como autores escribiendo artículos de este manual.
Jonathan MirCha
http://desarrolloweb.com/manuales/manual-nodejs.html Página 3 de 51
Manual de NodeJS
Introducción a NodeJS
NodeJS, conocido habitualmente también con la palabra "node" a secas, surge en 2009 como
respuesta a algunas necesidades encontradas a la hora de desarrollar sitios web,
específicamente el caso de la concurrencia y la velocidad.
En este artículo pretendemos explicar qué es Node, para qué se utiliza, por qué es bueno
aprenderlo ya y algunos de los proyectos más relevantes creados con esta tecnología, y que
muchos de nosotros conocemos.
http://desarrolloweb.com/manuales/manual-nodejs.html Página 4 de 51
Manual de NodeJS
¿Qué es NodeJS?
"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, está 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 correctamente 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 veremos con
detalle más adelante, son la programación asíncrona y la programación orientada 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 conocemos anteriormente en
Javascript "común".
Otro aspecto sobre el que está basada nodeJS son los “streams", que son flujos de datos que
están entrando en un proceso. Lo veremos con detalle más adelante.
http://desarrolloweb.com/manuales/manual-nodejs.html Página 5 de 51
Manual de NodeJS
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 infraestructura.
Otros ejemplos, además de LinkedIn son eBay, Microsoft, empresas dedicadas a hosting como
Nodester o Nodejitsu, redes sociales como Geekli.st, y muchos más. Podemos obtener más
referencias acerca de casos de uso y empresas que implementan NodeJS en el enlace
nodeknockout.com que es un hackaton donde se realizaron aplicaciones en Node.
Esto nos hace entender que es un buen momento para aprender NodeJS sin temor a que lo que
aprendamos acabe rápidamente en desuso.
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...
Estos son algunos ejemplos que destacó Alejandro, entre muchos otros que hay en Internet.
Son programas basados en Node que nos facilitan labores de desarrollo de aplicaciones web.
Conclusión
http://desarrolloweb.com/manuales/manual-nodejs.html Página 6 de 51
Manual de NodeJS
En este artículo nos hemos podido encontrar una base teórica de NodeJS, que viene muy bien
para saber un poco mejor qué es esta tecnología y cuáles son las ventajas que nos puede traer
su uso. Está claro que hay muchas otras cosas que querréis saber sobre Node y que te
invitamos a seguir descubriendo con nosotros.
En el siguiente artículo explicaremos dónde se obtiene NodeJS y cómo lo instalas. Todo ello a
partir del sitio web del propio NodeJS.
Además, te invitamos a seguir viendo el vídeo #nodeIO introducción a Node.JS del que este
texto es una mera transcripción. En dicho vídeo hemos recogido en este texto solamente hasta
el minuto 22, por lo que nos queda mucho por ver.
http://desarrolloweb.com/manuales/manual-nodejs.html Página 7 de 51
Manual de NodeJS
NodeJS 4
El interesante futuro de JavaScript del lado del servidor: NodeJS 4.0.0, versión
que une los proyectos Node de Joyent e io.js de la comunidad.
Node fue creado en 2009 por Ryan Dahl programador en ese entonces de la empresa Joyent
(dedicada a ofrecer servicios de cómputo en la nube) que a su vez se convirtió en la propietaria
de la marca Node.js™ y la que le daría patrocinio y difusión desde el momento de su creación.
Joyent puso todo su empeño para el desarrollo de Node, sin embargo, al ser una empresa del
sector privado y no una comunidad o fundación, los avances de Node comenzaron a ser muy
lentos, en comparación de lo que la comunidad solicitaba y que también quería contribuir.
Con el paso del tiempo y durante los siguientes 5 años (2009 a 2014) se fueron entregando
versiones de Node a paso de tortuga pues nunca se llego como tal a una versión 1.0.0 estable, la
última versión de Node bajo la gobernabilidad de Joyent fue la 0.12.7.
La comunidad al ver el brillante futuro que podría tener Node en el ecosistema web y la
insuficiencia (o incompetencia) de Joyent para sacarlo adelante, decide tomar cartas en el
asunto e intenta contribuir al core de Node, sin embargo Joyent se opone a reconocer
cualquier cambio no supervisado por ellos bajo el nombre comercial de Node.js™, por lo que la
comunidad decide lanzar un fork amigable de Node compatible con npm y liderado bajo un
modelo de gobernabilidad abierta con el nombre de io.js.
Con io.js el entorno de Node ganó mejoras que se venían esperando desde hace muchotiempo
tales como:
http://desarrolloweb.com/manuales/manual-nodejs.html Página 8 de 51
Manual de NodeJS
La reacción de Joyent, propietario de Node.js™ fue lanzar la versión 0.12.1 que la comunidad
estaba esperando desde hacía 2 años, sin embargo y por la premura y sorpresa de io.js salió
con un par de errores por lo que tuvieron que lanzar una versión 0.12.2 en cuestión de días.
Con ello Joyent logra mantener la paridad de características con io.js. Es importante
mencionar que todo esto sucede en diciembre del 2014 y io.js se libera oficialmente el 13 de
enero del 2015. Después de un par de meses de la liberación de io.js, ambas partes, comunidad
y Joyent manifiestan su intención de reconciliar los proyectos en uno sólo, la fundación Linux
se ofrece como mediador de la situación y entonces el 8 de mayo del 2015 se crea la Node.js
Foundation encargada de reunificar las tecnologías en una sola, dicho proyecto lo llamaron
Node.js Convergence.
Finalmente el 8 de septiembre del 2015 sale a la luz esa convergencia en Node 4.0.0 (estable) y
con ello un futuro interesante para JavaScript en el servidor.
A continuación les dejo una cronología de los hechos más importantes de este suceso:
http://desarrolloweb.com/manuales/manual-nodejs.html Página 9 de 51
Manual de NodeJS
En las siguientes entregas estaremos revisando y analizando las nuevas características que nos
ofrece Node 4.0.0.
http://desarrolloweb.com/manuales/manual-nodejs.html Página 10 de 51
Manual de NodeJS
Instalar NodeJS
Guía para la instalación del framework para Javascript del lado del servidor,
NodeJS.
En este artículo vamos a proceder a la instalación de Node, para tenerlo disponible en nuestro
sistema. Dado que NodeJS se ha convertido en una herramienta esencial para desarrolladores,
es muy posible que ya lo tengas instalado, ya que mucho de los complementos de desarrollo
frontend trabajan con NodeJS. La mejor manera de saber si ya tenemos Node instalado es
lanzar el comando en la consola "node -v" y si está instalado nos debería informar la versión
que tenemos.
Quizás ahora la principal duda que podremos tener es qué versión de NodeJS instalar, ya que
en el sitio web nos ofrecen dos alternativas. La recomendación es instalar la última versión, ya
que tiene soporte para más cosas y muchas herramientas la requieren.
Si ya tienes Node instalado en tu sistema puedes saltar la lectura de este articulo. También te
recomendamos que simplemente accedas al sitio de Nodejs y que descargues ese instalador y
lo instales por tu cuenta en unos minutos. Aquí podrás ver notas adicionales y alternativas de
instalación vía gestores de paquetes para sistemas como Linu o Mac.
Nota: El resto de este artículo es una transcripción del primer hangout sobre NodeJS
emitido en DesarrolloWeb.com, #nodeIO. En el primer artículo estuvimos conociendo una
introducción teórica a Node.JS.
http://desarrolloweb.com/manuales/manual-nodejs.html Página 11 de 51
Manual de NodeJS
Si no tienes instalado todavía Node.JS el proceso es bastante fácil. Por supuesto, todo
comienza por dirigirse a la página de inicio de NodeJS:
nodejs.org
Allí encontrarás el botón para instalarlo "Install" que pulsas y simplemente sigues las
instrucciones.
Los procesos de instalación son sencillos y ahora los describimos. Aunque son ligéramente
distintos de instalar dependiendo del sistema operativo, una vez lo tienes instalado, el modo de
trabajo con NodeJS es independiente de la plataforma y teóricamente no existe una
preferencia dada por uno u otro sistema, Windows, Linux, Mac, etc. Sin embargo, dependiendo
de tu sistema operativo sí puede haber unos módulos diferentes que otros, ésto es, unos
pueden funcionar en Linux y no así en otros sistemas, y viceversa.
Realmente poco hay que hablar de la instalación, pues es muy sencilla. Debido a ello, nuestro
amigo Alejandro Morales @_alejandromg, como ponente de #nodeIO no consideró necesario
agrega mucha más información. Sin embargo, para aquellos que necesitan una ayuda adicional
y para agregar algo más de contenido que pueda completar el Manual de NodeJS, ofreceré
alguna guía adicional, ya fuera del guión de la charla.
A partir de ahora, para ejecutar "Node" tienes que irte a la línea de comandos de Windows e
http://desarrolloweb.com/manuales/manual-nodejs.html Página 12 de 51
Manual de NodeJS
Nota: Ya debes saberlo, pero a la línea de comandos de Windows se accede desde el menú
de inicio, buscas "cmd" y encuentras el cmd.exe, que abre la línea de comandos. En algunos
sistemas Windows anteriores a 7 accedes también desde el menú de inicio, utilizas la
opción "Ejecutar" del menú de inicio y escribes "cmd".
Entonces entrarás en la línea de comandos del propio NodeJS donde puedes ya escribir tus
comandos Node, que luego veremos.
Con el primer comando obtienes el instalador y con el segundo comando haces la instalación
propiamente dicha. Luego puedes verificar la instalación con el comando "node -v" y te debería
salir la versión que se ha instalado en tu máquina.
Para solucionar esta situación podemos usar otros repositiorios y para ello te ofrecen en la
siguiente referencia instrucciones para instalar Node.JS desde diferentes gestores de
paquetes, para las distribuciones más habituales.
github.com
Siguiendo esa referencia, en mi ubuntu he ejecutado los siguientes comandos para instalar
la última versión:
http://desarrolloweb.com/manuales/manual-nodejs.html Página 13 de 51
Manual de NodeJS
brew update
$ node
console.log("hola mundo");
Podemos ver en la siguiente imagen un par de mensajes a la consola de Node que podemos
utilizar para comenzar nuestro camino.
http://desarrolloweb.com/manuales/manual-nodejs.html Página 14 de 51
Manual de NodeJS
Nota: Observarás que te salen unos mensajes "undefined" en la consola y es porque las
instrucciones que estamos ejecutando como "console.log()" no devuelven ningún valor.
Nota: Para salir de la línea de comandos de Node.JS pulsas CTRL + D o dos veces CRTL +
c.
Conclusión
Hay una referencia que el propio @_alejandromg comentó en el primero de los webcast
#nodeIO que es Node.js Hispano, donde tienen diversos artículos sobre NodeJS, incluidos
varios sobre la instalación de NodeJS en diversas plataformas.
http://desarrolloweb.com/manuales/manual-nodejs.html Página 15 de 51
Manual de NodeJS
En el Manual de NodeJS hemos conocido aspectos básicos sobre el lenguaje. Ahora que lo
conocemos un poco mejor y que ya lo tenemos instalado, podemos escribir nuestro primer
programa, usando instrucciones básicas del lenguaje.
Generalmente a los archivos Javascript les pondrás extensión ".js", aunque la verdad podrían
tener cualquier extensión que quieras, 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 estructura
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.
http://desarrolloweb.com/manuales/manual-nodejs.html Página 16 de 51
Manual de NodeJS
archivo, lo importante es que sepas dónde lo has dejado, porque para ejecutarlo tendrás que
situarte en esa carpeta desde tu terminal.
Nota: Aunque imaginamos que debes controlar este aspecto, decir que nos sirve cualquier
terminal. Linux y Mac tienen terminales suficientemente buenos para nuestro día a día,
pero en Windows muchas veces el terminal que nos viene se quedará pequeño. En
Windows, depende de la versión, tenemos un terminal (ejecutable escribiendo "cmd" desde
el menú de iniciar aplicaciones) básico que responde a comandos del antiguo MS-DOS.
Pero ahora muchas versiones ya tienen instalado "power shell" que está bastante mejor. Yo
por mi parte prefiero "git bash" que se instala cuando instalas "Git" en tu sistema. Otras
personas prefieren el terminal "cmder".
cd mi/proyecto/esta/ruta/debes/saberla/tu
Luego lanzamos el proceso de NodeJS indicando el nombre del archivo que vas a ejecutar:
node holamundo.js
Obviamente, si llamaste al archivo con otro nombre, colocarás ese nombre después de la
palabra "node".
Entonces deberías de ver la salida del programa por la misma terminal "hola mundo Node!".
Ahora vamos a ver qué otras cosas simples de lo que ya conoces de Javascript puedes aplicar
en Node.
http://desarrolloweb.com/manuales/manual-nodejs.html Página 17 de 51
Manual de NodeJS
Ahora vamos a ver cómo trabajar con alguna de las funciones básicas del API de Javascript,
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: Si te extraña ver una función como parámetro enviado a otra función, lo que se
conoce habitualmente como una función "callback", es que quizás te falta un poco de base
de Javascript para entrar en NodeJS. Esa función anónima (porque no tiene nombre) se
ejecutará solo cuando toque. De nuevo te recomendamos la lectura del Manual de
Javascript para ver estas cosas básicas del lenguaje.
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 proceso
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 programa.
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".
console.log(window);
Esa línea te dirá que no existe tal variable "window", con un mensaje como este
"ReferenceError: window is not defined".
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.
http://desarrolloweb.com/manuales/manual-nodejs.html Página 18 de 51
Manual de NodeJS
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() {
}, 1000);
De momento es todo. Practica un poco y continua la lectura por el artículo sobre las
características de la programación en la plataforma Node.
http://desarrolloweb.com/manuales/manual-nodejs.html Página 19 de 51
Manual de NodeJS
Este Manual de Node.JS está creado a través de unas charlas #nodeIO que hemos realizado en
DesarrolloWeb.com, de las cuales estos artículos son una transcripción. En este punto estamos
todavía en la primera charla, en la que Alejandro Morales nos está aclarando algunos
conceptos importantes para poder entender bien qué es NodeJS.
En el artículo anterior vimos cómo se instalaba esta NodeJS y en el presente texto veremos en
detalle algunas de las características más fundamentales de NodeJS. Entre todas ellas nuestro
ponente Alejandro Morales destacó: JavaScript sin limitaciones, Programación asíncrona y
Programación orientada a eventos. Todos estos puntos los veremos a continuación.
Pero no sólo eso, el Javascript original tiene algunas estructuras de control que realmente no
http://desarrolloweb.com/manuales/manual-nodejs.html Página 20 de 51
Manual de NodeJS
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.
Mientras que en las nuevas versiones de Javascript podrías hacer esto otro:
Object.keys(obj).forEach()
Programación Asíncrona
Éste es un concepto que algunas personas no consiguen entender a la primera y que ahora
toma especial importancia, dado que NodeJS fue pensado desde el primer momento 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 programación
asíncrona eres capaz de liberar el proceso de modo que los recursos se quedan 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 obtenga la
respuesta. Ese tiempo, por corto que sea, dejaría un proceso esperando en la programación
tradicional y en la asíncrona simplemente se libera. 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 mediante 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 respuesta.
Nota: Estos callbacks probablemente ya los hayas usado un montón de veces si tienes
experiencia con Javascript del lado del cliente, porque se usan en funciones muy habituales
como setTimeout(), que también está disponible en NodeJS. Librerías Javascript como
jQuery también las usan de manera intensiva.
http://desarrolloweb.com/manuales/manual-nodejs.html Página 21 de 51
Manual de NodeJS
console.log("hola");
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 veremos el
mensaje "hola" en la consola, luego el mensaje "ya!" y por último, cuando el fichero terminó su
lectura, veremos el mensaje "archivo".
La solución es hacer un esfuerzo adicional por estructurar nuestro código. Básicamente se trata
de modularizar el código, escribiendo cada función aparte e indicando solamente su nombre
cuando se define el callback. Podrías incluso definir las funciones en archivos aparte y
requiriéndolas con require("./ruta/al/archivo") en el código de tu aplicación. Todo esto lo
veremos con detalle en numerosos ejemplos en el Manual de NodeJS, por lo que no te debes de
preocupar mucho si todavía no lo entiendes.
Al conseguir niveles de indentación menos profundos estamos ordenando el código, con lo que
será más sencillo de entender y también más fácil de encontrar posibles errores. Además, a la
larga conseguirás que sea más escalable y puedas extenderlo en el futuro o mantenerlo por
cualquier cuestión.
Nota: También en ES6 existen otras herramientas como las promesas que te ayudan a
mantener tu código ordenado con la programación asíncrona y el uso de callbacks
http://desarrolloweb.com/manuales/manual-nodejs.html Página 22 de 51
Manual de NodeJS
Algunos consejos a la hora de escribir código para que éste sea de mayor calidad:
Escribe código modularizado (un archivo con más de 500 líneas de código puede que
esté mal planteado)
No abuses, no repitas las mismas cosas, mejor reusa.
Usa librerías que ayuden al control cuando lo veas necesario (como async que te ayuda a
ordenar ese montón de callbacks)
Usa promesas y futuros
Conoce el lenguaje y mantente al día con las novedades de las presentes y futuras
versiones de Javascript ES6, ES7...
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 servidor 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 diferencia con los
eventos de Javascript común que son del lado del cliente y ocurren en el navegador.
Nota: La comparación de Node.JS con lenguajes del lado del servidor viene bien para
entender 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
ExpressJS para dar mayores facilidades para la creación de sitios aplicaciones web.
Conclusión
Poco a poco vamos entendiendo qué es (y que NO es) NodeJS. Son todo conceptos que
resultarán nuevos para muchos de los lectores y por ello era importante dejarlos claros. Ahora
vamos a pasar a explicar algunas otras cosas de interés que utilizamos en el día a día en esta
plataforma, como el gestor de paquetes npm.
http://desarrolloweb.com/manuales/manual-nodejs.html Página 23 de 51
Manual de NodeJS
http://desarrolloweb.com/manuales/manual-nodejs.html Página 24 de 51
Manual de NodeJS
Qué son los módulos en NodeJS, el gestor de paquetes NPM que permite
administrar los módulos y dependencias que necesitamos en un proyecto local.
En el Manual de NodeJS estamos partiendo como base de las charlas #nodeIO ofrecidas por
Alejandro Morales para DesarrolloWeb.com. En este caso todavía nos encontramos viendo
contenido de nuestra primera charla, en la que nuestro ponente nos informa de una de las
partes fundamentales en nuestros procesos de desarrollo en NodeJS, como son los
módulos. Además, vimos el gestor de paquetes que viene en el framework.
En NodeJS el código se organiza por medio de módulos. Son como los paquetes o librerías de
otros lenguajes como Java. Por su parte, NPM es el nombre del gestor de paquetes (package
manager) que usamos en Node JS.
Si conoces los gestores de paquetes de Linux podrás hacerte una buena idea de lo que es npm,
si no, pues simplemente entiéndelo como una forma de administrar módulos que deseas tener
instalados, distribuir los paquetes y agregar dependencias a tus programas.
Nota: Por ejemplo, si estás acostumbrado a Ubuntu, el gestor de paquetes que se utiliza es
el "apt-get". Por su parte, Fedora o Red Hat usan Yum. En Mac, por poner otro ejemplo,
existe un gestor de paquetes llamado Homebrew.
http://desarrolloweb.com/manuales/manual-nodejs.html Página 25 de 51
Manual de NodeJS
Javascript nativo no da soporte a los módulos. Esto es algo que se ha agregado en NodeJS y se
realiza con la sentencia require(), que está inspirada en la variante propuesta por
CommonJS.
La instrucción require() recibe como parámetro el nombre del paquete que queremos incluir e
inicia una búsqueda en el sistema de archivos, en la carpeta "node_modules" y sus hijos, que
contienen todos los módulos que podrían ser requeridos.
Por ejemplo, si deseamos traernos la librería para hacer un servidor web, que escuche
solicitudes http, haríamos lo siguiente:
function suma(a,b){
return a + b;
function multiplicar(a,b){
return a * b;
module.exports = {
suma: suma,
multiplicar: multiplicar
http://desarrolloweb.com/manuales/manual-nodejs.html Página 26 de 51
Manual de NodeJS
operaciones.suma(2,3);
Obviamente, esto es solo una toma de contacto y volveremos sobre este asunto más adelante.
require("async");
Nota: Cabe fijarse en que no hace falta darle la ruta al paquete "async" porque npm me lo
ha instalado dentro de node_modules y todo lo que está en esa carpeta se encuentra
disponible para require() sin necesidad de decirle la ruta exacta para llegar.
Otras instrucciones posibles de npm son la de publicar paquetes (con "publish"), instalar
globalmente (poniendo el flag -g al hacer el "install"), desinstalar, incluso premiar (puntuar
paquetes hechos por otras personas), etc.
Podemos ver paquetes a instalar entrando en la página del gestor de paquetes npm: npmjs.org
Por último, sobre npm se mencionó que cada paquete tiene entre su código un archivo
package.json que contiene en notación JSON los datos del paquete en sí. Es como una tarjeta
de identificación del paquete, que puede servir para informarte a ti mismo y a cualquier
sistema informático de sus características. Si tú fueras el creador de un paquete, o crearas
alguna aplicación con NodeJS, también deberías incluir "package.json" con los datos del
módulo o aplicación que se está creando, como son el autor, versión, dependencias, etc.
En el siguiente artículo vamos a ver algo más específico, que también nos sirva como primer
ejemplo para realizar en NodeJS. En concreto veremos el módulo HTTP, con el que podremos
hacer un rudimentario servidor web.
http://desarrolloweb.com/manuales/manual-nodejs.html Página 27 de 51
Manual de NodeJS
existen muchos paquetes de Node que te facilitan tareas relacionadas con el sistema operativo.
Estos paquetes, una vez instalados, se convierten en comandos disponibles en terminal, con los
que se pueden hacer multitud de cosas. Existen cada vez más módulos de Node que nos
ofrecen muchas utilidades para los desarrolladores, accesibles por línea de comandos, como
Bower, Grunt, etc.
Las instrucciones para la instalación de paquetes de manera global son prácticamente las
mismas que ya hemos pasado para la instalación de paquetes en proyectos. En este caso
simplemente colocamos la opción "-g" que permite que ese comando se instale de manera
global en tu sistema operativo.
http://desarrolloweb.com/manuales/manual-nodejs.html Página 28 de 51
Manual de NodeJS
Este es el módulo que nos sirve para trabajar con el protocolo HTTP, que es el que se utiliza en
Internet para transferir datos en la Web. Nos servirá para crear un servidor HTTP que acepte
solicitudes desde un cliente web y servirá como colofón a la introducción a Node.
Como queremos hacer uso de este módulo, en nuestro ejemplo empezaremos por requerirlo
mediante la instrucción "require()".
Nota: Existen otros módulos que crean servidores como es el caso de "net", "tcp" y "tls".
A partir de este momento tenemos una variable http que en realidad es un objeto, sobre el que
http://desarrolloweb.com/manuales/manual-nodejs.html Página 29 de 51
Manual de NodeJS
podemos invocar métodos que estaban en el módulo requerido. Por ejemplo, una de las tareas
implementadas en el módulo HTTP es la de crear un servidor, que se hace con el módulo
"createServer()". Este método recibirá un callback que se ejecutará cada vez que el servidor
reciba una petición.
respuesta.end("Hola DesarrolloWeb.com");
});
La función callback que enviamos a createServer() recibe dos parámetros que son la petición y
la respuesta. La petición por ahora no la usamos, pero contiene datos de la petición realizada.
La respuesta la usaremos para enviarle datos al cliente que hizo la petición. De modo que
"respuesta.end()" sirve para terminar la petición y enviar los datos al cliente.
Ahora voy a decirle al servidor que se ponga en marcha. Porque hasta el momento solo hemos
creado el servidor y escrito el código a ejecutar cuando se produzca una petición, pero no lo
hemos iniciado.
server.listen(3000, function(){
});
Con esto le decimos al servidor que escuche en el puerto 3000, aunque podríamos haber
puesto cualquier otro puerto que nos hubiera gustado. Además "listen()" recibe también una
función callback que realmente no sería necesaria, pero que nos sirve para hacer cosas cuando
el servidor se haya iniciado y esté listo. Simplemente, en esa función callback indico que estoy
listo y escuchando en el puerto configurado.
respuesta.end("Hola DesarrolloWeb.com");
});
server.listen(3000, function(){
});
Ahora podemos guardar ese archivo en cualquier lugar de nuestro disco duro, con extensión
.js, por ejemplo servidor.js.
Nota: Si estamos en Windows podríamos guardar el archivo en una carpeta que se llame
http://desarrolloweb.com/manuales/manual-nodejs.html Página 30 de 51
Manual de NodeJS
node servidor.js
Entonces en consola de comandos nos debe aparecer el mensaje que informa que nuestro
servidor está escuchando en el puerto 3000.
http://localhost:3000
Aprende Javascript para poder pasar luego a NodeJS con garantías. Es más importante
el hecho de dominar el propio Javascript que tener idea de otros lenguajes de
programación del lado del servidor.
Si tienes una base suficiente de Javascript, destina al menos una semana, unas 40
horas, para aprender NodeJS y realizar algún ejemplo interesante. muéstralo a tus
amigos y promociona lo que has aprendido y estarás ayudando a la comunidad de
NodeJS, divulgando esta tecnología.
Conclusión
Continuaremos a partir de aquí comentando algunos otros actores de la programación sobre
NodeJS, como los eventos y los stream y realizando ejemplos un poco más complejos. Si
quieres ir aprendiendo las cosas que veremos en los próximos artículos, te recomiendo ver el
segundo webcast #nodeIO dedicado a los eventos, streams y más.
http://desarrolloweb.com/manuales/manual-nodejs.html Página 31 de 51
Manual de NodeJS
http://desarrolloweb.com/manuales/manual-nodejs.html Página 32 de 51
Manual de NodeJS
Eventos en NodeJS
En este artículo explicaremos qué son los eventos del lado del servidor y cómo se implementan
en Node.JS. Por si os interesa, es importante comentar que este texto está extractado del
segundo programa #nodeIO emitido en directo en DesarrolloWeb.com por Alejandro Morales
y Miguel Angel Alvarez: #nodeIO eventos, streams y más.
Para hacernos una idea más exacta, pensemos por ejemplo en un servidor HTTP, donde
tendríamos el evento de recibir una solicitud. Por poner otro ejemplo, en un stream de datos
tendríamos un evento cuando se recibe un dato como una parte del flujo.
Módulo de eventos
Los eventos se encuentran en un módulo independiente que tenemos que requerir en nuestros
programas creados con Node JS. Lo hacemos con la sentencia "require" que conocimos en
artículos anteriores cuando hablábamos de módulos.
http://desarrolloweb.com/manuales/manual-nodejs.html Página 33 de 51
Manual de NodeJS
Dentro de esta librería o módulo tienes una serie de utilidades para trabajar con eventos.
Nota: Ese "EmisorEventos" es una clase de programación orientada a objetos (POO), por
eso se le ha puesto en el nombre de la clase la primera letra en mayúscula. Por convención
se hace así con los nombres de las clases en POO.
Primero tendremos que "instanciar" un objeto de la clase EventEmitter, que hemos guardado
en la variable EmisorEventos en el punto anterior de este artículo.
Luego tendremos que usar el método on() para definir las funciones manejadoras de eventos, o
su equivalente addEventListener(). Para emitir un evento mediante código Javascript usamos
el método emit().
Por ejemplo, voy a emitir un evento llamado "datos", con este código.
ee.emit('datos', Date.now());
Ahora voy a hacer una función manejadora de eventos que se asocie al evento definido en
"datos".
ee.on('datos', function(fecha){
console.log(fecha);
http://desarrolloweb.com/manuales/manual-nodejs.html Página 34 de 51
Manual de NodeJS
});
setInterval(function(){
ee.emit('datos', Date.now());
}, 500);
ee.on('datos', function(fecha){
console.log(fecha);
});
setInterval(function(){
ee.emit('datos', Date.now());
}, 500);
Esto lo podemos guardar como "eventos.js" o con cualquier otro nombre de archivos que
deseemos. Lo guardamos en el lugar que queramos de nuestro disco duro.
Para ponerlo en ejecución nos vamos en línea de comandos hasta la carpeta donde hayamos
colocado el archivo "eventos.js" o como quiera que lo hayas llamado y escribes el comando:
node eventos.js
Nota: También podrías haber ejecutado el comando "node eventos" sin indicar la
extensión ".js" porque NodeJS ya da por supuesto que le has colocado esa extensión al
archivo.
Como resultado, veremos que empiezan a aparecer líneas en la ventana del terminal del
sistema operativo, con un número, que es el "timestamp" de la fecha de cada instante inicial.
Puedes salir del programa pulsando las teclas CTRL + c.
Por si te lía esto de ejecutar archivos por medio de la línea de comando, a continuación puedes
http://desarrolloweb.com/manuales/manual-nodejs.html Página 35 de 51
Manual de NodeJS
ver una pantalla del terminal donde hemos puesto en marcha este pequeño ejercicio de
eventos.
Conclusión
Con esto hemos podido obtener una primera aproximación a lo que son los eventos en NodeJS
y la manera de crear esas funciones "callback" para ejecutar cuando se producen, también
llamadas manejadores de eventos.
En los siguientes capítulos pasaremos a hablaros de los streams, que son bastante más
importantes en el mundo de Node.JS.
http://desarrolloweb.com/manuales/manual-nodejs.html Página 36 de 51
Manual de NodeJS
Cómo dar los primeros pasos con Express, el popular framework de NodeJS con
el que podemos crear aplicaciones web y APIs REST.
En este artículo vamos a explicar cómo comenzar con Express, el framework más usado en
NodeJS, que nos facilitará la creación de servidores web en muy pocos minutos,
personalizados según nuestras necesidades.
Instalaremos Express y crearemos nuestro primer servidor, configurado para atender ciertas
rutas. Aprenderemos a poner en marcha el servidor, de modo que quede escuchando
solicitudes de posibles clientes a los que atender.
Prácticamente usarás la misma cantidad de líneas de código para iniciar Express que para
hacer un servidor desde cero, pero te permitirá no solo servir archivos estáticos, sino atender
todo tipo de solicitudes complejas que impliquen realizar cualquier tipo de acción, configurar
rutas de manera potente, trabajar de detalladamente con las cabeceras del HTTP y las
respuestas, etc. Incluso desarrollar tu propio API REST de una manera más o menos sencilla.
En definitiva, Express es un compañero ideal de NodeJS cuando lo que se quiere hacer es una
aplicación web. Dentro de Node es la alternativa más usada, por lo que encontrarás cantidad
de ayudas y comunidad para resolver tus dudas o necesidades.
Instalar Express
Express se instala vía "npm". Ya debes conocer la operativa para instalar paquetes de Node, así
http://desarrolloweb.com/manuales/manual-nodejs.html Página 37 de 51
Manual de NodeJS
npm init
Nota: Este código lo puedes poner en tu index.js (o cualquier otro nombre de archivo que
quieras usar, con extensión .js) que puedes crear en la raíz de tu proyecto.
A continuación vamos a inicializar una aplicación Express. Para ello vamos a ejecutar la
función que obtuvimos al hacer el require del módulo 'express'.
Obtenemos como respuesta una variable, que nosotros hemos llamado "app" (convención
usada en la mayoría de las veces), mediante la cual podemos configurar la aplicación haciendo
uso del API de Express.
Uno de los muchos métodos que tenemos disponibles es listen(), que nos sirve para poner a
nuestro servidor web a la escucha.
app.listen(3001, function() {
});
El método listen recibe el puerto donde el servidor debe comunicarse con el exterior. El resto
de los parámetros son opcionales. En este caso estamos enviando tambien una función
callback, que se ejecutará cuando el servidor esté listo, escuchando en el puerto indicado.
En principio con esto ya tenemos nuestro servidor listo. De hecho, si ahora ejecutamos nuestro
script, desde el terminal con el comando:
http://desarrolloweb.com/manuales/manual-nodejs.html Página 38 de 51
Manual de NodeJS
node index
Comprobaremos que el servidor se pone a la escucha y nos avisa con el mensaje que contiene la
ruta donde enviar las solicitudes http. Sin embargo, todavía no le hemos dicho qué debe
responder ante qué solicitudes.
});
Nota: Como puedes imaginar, además de get() existen métodos para definir
comportamientos cuando se reciben solicitudes mediante otros verbos del HTTP, como
post(), put(), etc.
Como primer parámetro del método get() debemos indicar el patrón de la ruta que queremos
recibir. En este caso hemos colocado "/", que equivale a la ruta raíz del servidor. Como
segundo parámetro colocamos la función que se ejecutará cuando se reciba una solicitud con
tal patrón.
La función encargada de resolver la solicitud recibe dos parámetros que nosotros hemos
nombrado "req" y "res" (también por convención). No son más que la "request" de la solicitud
HTTP y la "response" que enviaremos al cliente.
Apoyándonos en el método send() del objeto "res" (response) podemos enviar cosas como
respuesta. En nuestro primer ejemplo hemos enviado una simple cadena de texto como
respuesta, pero podría ser un HTML, un fichero, un JSON, etc. Si ahora ejecutas tu servidor de
nuevo, accediendo a la raíz, podrás ver el mensaje "Hola mundo!! Express!!".
Nota: Ten en cuenta que, para que funcione esta nueva ruta, debes detener y reiniciar el
servidor. Desde el terminal de comandos debes salir de la ejecución del servidor con
CTRL+C y luego reiniciarlo invocando de nuevo al programa con el comando "node index"
(o cualquier nombre de archivo que hayas usado para este script).
Existen cientos de formas de aprovechar el sistema de rutas para conseguir cosas diferentes.
Por ejemplo, usando parámetros en las rutas tal como sigue:
http://desarrolloweb.com/manuales/manual-nodejs.html Página 39 de 51
Manual de NodeJS
});
En la ruta definida ahora ":nombre" indica que es un parámetro que puede tomar cualquier
valor. Estamos configurando la ruta "bienvenido/" seguido de cualquier cadena. Para recibir el
valor de la cadena eb ka ruta tendremos disponible en el objeto request.params. El resultado es
que una ruta como como http://localhost:3001/bienvenido/miguel, nos contestará con el texto
"Bienvenido!! miguel!!
Simple, ¿no?. Quizás lo veas así, pero es muy potente, pues solo hemos visto lo más básico.
Existen cientos de configuraciones en Express para satisfacer cualquier necesidad que se te
ocurra.
http://desarrolloweb.com/manuales/manual-nodejs.html Página 40 de 51
Manual de NodeJS
Qué son las variables de entorno, cómo generarlas al ejecutar una aplicación
NodeJS y cómo acceder a ellas desde el código de un script.
Son útiles en diversos casos del desarrollo en general, pero muy habituales en el desarrollo web
porque en la mayoría de las ocasiones los programas se deben ejecutar en diferentes
ordenadores. Por ejemplo, durante la etapa de desarrollo puede que tengamos unas
configuraciones de entorno y cuando se ponga el programa en producción éstas cambien.
Ejemplos habituales de las variables entorno serían el puerto donde escucha un servidor web,
el servidor de base de datos, junto con el usuario y clave para conexión, llaves de APIs, etc.
Todos esos valores generalmente pueden cambiar cuando se escribe un programa (al ejecutarlo
en local) y cuando se publica el script en un servidor en producción.
Los valores no querremos escribirlos "a fuego" en el programa (de manera literal en el código)
porque esto nos obligaría a cambiar el código del programa cada vez que se ejecuta en
diferentes lugares, dificultando el proceso de despliegue de los programas. Generalmente
desearemos definir esos valores al ejecutar el programa, de modo que cuando lancemos los
scripts se pueblen esos valores necesarios para funcionar en cualquier ambiente.
Seguro que si estás familiarizado con el desarrollo web estarás al tanto de la necesidad de las
variables de entorno y si no es así este artículo te puede abrir las puertas a soluciones que más
tarde o temprano vas a tener que implementar.
http://desarrolloweb.com/manuales/manual-nodejs.html Página 41 de 51
Manual de NodeJS
Por ejemplo, una variable de entorno llamada "PORT" se accedería a través de esta referencia:
process.env.PORT
process.env['PORT']
Lo que puede ocurrir es que las variables de entorno no siempre se hayan definido, por lo
que es útil que en nuestro programa les asignemos unos valores predeterminados. Esto lo
podemos conseguir con un código como este:
var puerto;
if(process.env.PORT) {
puerto = process.env.PORT;
} else {
puerto = 3000;
Sin embargo, una estructura condicional como la anterior se puede expresar de una manera
mucho más resumida en Javascript, que debes de conocer:
Otra cosa que podrías realizar para definir los valores de variables de entorno por defecto es
http://desarrolloweb.com/manuales/manual-nodejs.html Página 42 de 51
Manual de NodeJS
escribirlos directamente sobre el propio objeto "process.env". Esto podría ser útil para
compartir esos valores en diferentes módulos de tu aplicación, ya que process.env es un objeto
disponible de manera global.
Esto produce que, si existe esa variable de entorno, no se modifique, pero si no existe se crea
con un valor predeterminado. Esta construcción es perfectamente posible porque en Javascript
somos capaces de escribir cualquier propiedad en cualquier objeto, aunque sean objetos "de
sistema".
Como sabes, una aplicación node se ejecuta así: (si el archivo de arranque se llama "simple-
env.js")
node simple-env
Ahora, para especificar las variables de entorno, en lo que era nuestro comando "node" seguido
del script a ejecutar, anteponemos la asignación de aquellas variables que deseemos definir.
Conclusión
Eso es todo lo que necesitas conocer de las variables de entorno para usarlas en tu aplicación
NodeJS. Como has visto, su uso es realmente sencillo y sus aplicaciones son muy amplias y
útiles.
Otra cosa es cómo las quieras gestionar de una manera ágil en tu programa, manteniendo
quizás sus valores en un archivo de texto independiente, fácil de editar y de mantener en tu
repositorio de código. Eso que es un poco más avanzado lo veremos en un artículo más
adelante.
http://desarrolloweb.com/manuales/manual-nodejs.html Página 43 de 51
Manual de NodeJS
Es normal que en una aplicación NodeJS mantengamos variables de entorno con valores
diferentes cuando estamos en desarrollo y cuando estamos en producción o en cualquier otro
ambiente que tengamos. En este artículo te explicaremos una posible manera de estructurar
nuestras variables de entorno, en grupos, de modo que las podamos cambiar todas de una
única vez dependiendo de si estamos en Producción, Desarrollo, Test, etc.
Nota: Como hemos dicho, vamos a mantener las cosas sencillas, pero aumentar por
nuestra cuenta la versatilidad de un script, para que se pueda ejecutar sin cambiar el código
fuente en diversos ambientes. Si ya queremos mejorar las prestaciones y disponer de otras
funcionalidades es interesante comentar que existen librerías completas para la gestión de
variables de entorno como es el caso de https://github.com/indexzero/nconf
http://desarrolloweb.com/manuales/manual-nodejs.html Página 44 de 51
Manual de NodeJS
Por ejemplo, para usar el conjunto de variables de entorno predeterminado, que podrían ser
los valores necesarios en la etapa de desarrollo, podríamos ejecutar nuestra aplicación sin
definir ninguna variable de entorno:
node group-env.js
Si luego queremos ejecutar esta aplicación con los valores de todas las variables de entorno
necesarias para producción, entonces tendríamos que ejecutar la aplicación indicando que
estamos en el entorno de producción:
"development": {
"SERVERURL": "http://localhost:3001/",
"PORT": 3001
},
"production": {
"SERVERURL": "https://app.desarrolloweb.com/",
"PORT": 5000
Este código lo colocaremos en un archivo a parte, que requeriremos cuando sea necesario. El
nombre del archivo es indiferente, en nuestro caso lo hemos guardado dentro de
"env.variables.json".
http://desarrolloweb.com/manuales/manual-nodejs.html Página 45 de 51
Manual de NodeJS
El el caso anterior, todos los posibles juegos de variables de entorno se volcarán en un objeto al
que hemos nombrado envJSON.
Ya solo nos queda definir qué conjunto de variables vamos a usar, para lo que vamos a recibir
un única variable de entorno "NODE_ENV". Además, si no se encuentra esa variable vamos a
especificar que su valor sea "development".
Con esa variable de entorno podemos tomar los valores necesarios del JSON, por ejemplo:
Y si queremos acceder a una única variable de entorno, podríamos hacer algo como esto:
El código de nuestro módulo podría ser algo como esto: (lo hemos colocado en un archivo
config-module.js, pero podrías usar cualquier nombre que quieras)
exports.config = function() {
return envJSON[node_env];
Ahora, para acceder a las variables de entorno hacemos el require del módulo anterior (y
ejecutamos la función que nos exporta, llamada config) que realiza el acceso al grupo de
valores de entorno que necesitamos en cada caso.
http://desarrolloweb.com/manuales/manual-nodejs.html Página 46 de 51
Manual de NodeJS
http://desarrolloweb.com/manuales/manual-nodejs.html Página 47 de 51
Manual de NodeJS
En NodeJS todas las operaciones de acceso al sistema de archivos están englobadas dentro del
módulo "fs" (File System). Si queremos leer un archivo de texto que tenemos en local
simplemte usaremos ese módulo para extraer el contenido del fichero, indicando su ruta y otra
serie de parámetros que ahora describiremos.
En lo que respecta a los métodos del módulo fs hay que señalar que se entregan en dos
alternativas, tanto síncrona como asíncrona, que pueden cubrir diferentes situaciones y
necesidades que tengamos. Quizás esta sea la parte más destacable del API de NodeJS, del que
seguro que ya nos venimos familiarizando a lo largo del Manual de Node, la necesidad de lidiar
con funciones asíncronas y sus callback. Lo explicaremos con detalle.
Importar el módulo fs
Igual que hacemos con otros módulos de Node, hay que procesar el correspondiente require
para tener disponibles las funciones de acceso al sistema de ficheros. Se encuentran en el
module llamado 'fs' y lo vamos a importar con el siguiente código:
let fs = require('fs');
Nota: El nombre del objeto para operar con el sistema de archivos lo hemos guardado en
una variable llamada 'fs'. Podrías usar el nombre de variable que tú desees. Observa además
que en vez de "var" estamos usando "let", que es la forma más habitual de declarar variables
en ES6. Método readFile() asíncrono.
Este método accede a un fichero para su lectura y nos entrega el contenido en forma de buffer
http://desarrolloweb.com/manuales/manual-nodejs.html Página 48 de 51
Manual de NodeJS
o en forma de cadena.
El segundo parámetro, el opcional, puede ser tanto un objeto como una cadena. Generalmente
le indicarás una cadena que contendrá el juego de caracteres en el que el archivo está
codificado, por ejemplo 'utf-8'.
El tercer parámetro es la función callback, que se ejecutará en el momento que el archivo está
leído y se encuentra disponible para hacer alguna cosa. Esta función recibirá dos parámetros,
el archivo ya leído o bien, si ocurre algún error, entonces recibiremos el correspondiente objeto
de error de Node. Se puede ver en el siguiente ejemplo:
let fs = require('fs');
if(err) {
} else {
console.log(data);
});
Nota: Estoy usando la notación 'arrow function' de ES6 para resumir las funciones de
Javascript en menos código. Esto es perfectamente compatible con las versiones modernas
de Node y una recomendación por varios motivos.
Si ese archivo existe, simplemente veremos su contenido como salida del programa. Ojo en
este punto, pues si no indicas la codificación, la función te devolverá un buffer en lugar del
string.
Si el archivo no existía, nos mostrará el error y podremos ver los diferentes campos del objeto
error de node, desde los que podremos saber qué es lo que ha ocurrido. La salida sería parecida
a esta:
at Error (native)
errno: -2,
code: 'ENOENT',
syscall: 'open',
http://desarrolloweb.com/manuales/manual-nodejs.html Página 49 de 51
Manual de NodeJS
path: 'archivo-inexistente.txt' }
Nota: Digamos que este método equivaldría a la lectura de archivos en la mayoría de los
lenguajes de programación. Al ejecutarse bloquea el flujo de ejecución actual, de modo que
el código del programa se procesará siempre de manera secuencial.
fs.readFileSync(file[, options])
Otra diferencia es que el archivo leído será devuelto por la función. Podemos ver un ejemplo a
continuación.
En esta función, en caso de ocurrir algún tipo de error se lanzará una excepción. En el anterior
código no lo hemos realizado, pero se debería tratar si no queremos romper la ejecución del
programa.
La ventaja de la funcion síncrona es que quizás, para muchas personas, sea más sencillo de
codificar, ya que te ahorras las funciones callback. La desventaja es que el procesamiento
estará menos optimizado, ya que el hilo de ejecución se quedará unos instantes simplemente
esperando, incapaz de adelantar trabajo con el resto del script. en cualquier caso, las
diferencias de optimización de la función asíncrona se notarán más con la lectura de varios
archivos grandes, o cuando hay diversos accesos concurrentes al servidor donde se realizan
diversos tipos de operaciones.
Para acabar vamos a dejar un código que pone en demostración el flujo de ejecución del
programa, usando las dos variantes, síncrona y asíncrona. Es interesante que lo analices y
trates de averiguar qué mensajes se mostrarán antes o después.
http://desarrolloweb.com/manuales/manual-nodejs.html Página 50 de 51
Manual de NodeJS
let fs = require('fs');
if(err) {
} else {
console.log(data);
});
console.log(archivo);
http://desarrolloweb.com/manuales/manual-nodejs.html Página 51 de 51