Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Web Development
Code

Aprendiendo JavaScript del lado del servidor con Node.js

by
Difficulty:IntermediateLength:LongLanguages:

Spanish (Español) translation by Elías Nicolás (you can also view the original English article)

Node.js es todo el rumor en este momento, y facilita la creación de aplicaciones web de alto rendimiento en tiempo real. Permite que JavaScript se use de principio a fin, tanto en el servidor como en el cliente. Este tutorial lo guiará a través de la instalación de Node y su primer programa "Hello World", para construir un servidor de streaming de Twitter escalable.

¿Qué es Node.js?


NodeJS

JavaScript tradicionalmente solo se ejecuta en el navegador web, pero recientemente ha habido un considerable interés en llevarlo también al servidor, gracias al proyecto CommonJS. Otros entornos de JavaScript del lado del servidor incluyen Jaxer y Narwhal. Sin embargo, Node.js es un poco diferente de estas soluciones, porque está basado en eventos en lugar de basado en subprocesos. Los servidores web como Apache que se utilizan para servir PHP y otras secuencias de comandos CGI se basan en subprocesos porque generan una cadena de sistema para cada solicitud entrante. Si bien esto está bien para muchas aplicaciones, el modelo basado en subprocesos no se adapta bien a muchas conexiones de larga duración como las que necesitaría para poder utilizar aplicaciones en tiempo real como Friendfeed o Google Wave.

"Cada operación de E / S en Node.js es asincrónica ..."

Node.js, utiliza un bucle de evento en lugar de hilos, y puede escalar a millones de conexiones simultáneas. Aprovecha el hecho de que los servidores pasan la mayor parte del tiempo esperando operaciones de E / S, como leer un archivo desde un disco duro, acceder a un servicio web externo o esperar que un archivo termine de cargarse, porque estas operaciones son mucho más lentas que en las operaciones de memoria. Cada operación de E / S en Node.js es asíncrona, lo que significa que el servidor puede continuar procesando las solicitudes entrantes mientras se lleva a cabo la operación de E / S. JavaScript es muy adecuado para la programación basada en eventos porque tiene funciones anónimas y cierres que facilitan la definición de devoluciones de llamadas en línea, y los desarrolladores de JavaScript ya saben cómo programar de esta manera. Este modelo basado en eventos hace que Node.js sea muy rápido y hace que las aplicaciones en tiempo real sean muy fáciles de escalar.


Paso 1 Instalación

Node.js se ejecuta en sistemas basados ​​en Unix, como Mac OS X, Linux y FreeBSD. Desafortunadamente, Windows aún no es compatible, por lo que si usted es un usuario de Windows, puede instalarlo en Ubuntu Linux usando Virtualbox. Para hacerlo, sigue este tutorial. Deberá usar la terminal para instalar y ejecutar Node.js.

  1. Descargue la última versión de Node.js de nodejs.org (la última versión al momento de escribir esto es 0.1.31) y descomprímala.
  2. Abra la terminal y ejecute los siguientes comandos.

    Se enviarán muchos mensajes al terminal a medida que Node.js se compila e instala.


Paso 2 ¡Hola mundo!

Cada nueva tecnología comienza con un "¡Hola mundo!" tutorial, por lo que crearemos un servidor HTTP simple que sirva ese mensaje. En primer lugar, sin embargo, debe comprender el sistema de módulos Node.js. En Node, la funcionalidad se encapsula en módulos que deben cargarse para poder ser utilizados. Hay muchos módulos listados en la documentación de Node.js. Cargue estos módulos utilizando la función require así:

Esto carga el módulo sys, que contiene funciones para hacer frente a las tareas de nivel del sistema, como la impresión de salida en el terminal. Para usar una función en un módulo, llámela a la variable en la que almacenó el módulo, en nuestro caso sys.

Ejecutar estas dos líneas es tan simple como ejecutar el comando node con el nombre de archivo del archivo javascript como argumento.

Esto dará como resultado "Hello World!" a la línea de comando cuando se ejecuta.

Para crear un servidor HTTP, debe require el módulo http.

Este script importa los módulos sys y http, y crea un servidor HTTP. Se llamará a la función anónima que se pasa a http.createServer siempre que entre una solicitud en el servidor. Una vez que se crea el servidor, se le indica que escuche en el puerto 8080. Cuando llega una solicitud al servidor, primero enviamos encabezados HTTP con el tipo de contenido y el código de estado de 200 (correcto). Luego enviamos "¡Hola mundo!" y cierra la conexión. Puede notar que tenemos que cerrar explícitamente la conexión. Esto hará que sea muy fácil transmitir datos al cliente sin cerrar la conexión. Si ejecuta este script y va a http://localhost:8080/ en su navegador, verá "Hello World!"


Paso 3 Un servidor de archivos estáticos simple

De acuerdo, entonces hemos creado un servidor HTTP, pero no envía nada excepto "Hello World", sin importar a qué URL vaya. Cualquier servidor HTTP debe poder enviar archivos estáticos como archivos HTML, imágenes y otros archivos. El siguiente código hace justamente eso:

Comenzamos requiriendo todos los módulos que necesitaremos en nuestro código. Esto incluye los módulos sys, http, url, path, y fs o filesystem. A continuación, creamos un servidor HTTP como lo hicimos antes. Esta vez, usaremos el módulo url para analizar la URL entrante de la solicitud y encontrar la ruta del archivo al que se accede. Encontramos el nombre de archivo real en el disco duro del servidor utilizando path.join, que une process.cwd(), o el directorio de trabajo actual, con la ruta al archivo que se solicita. A continuación, verificamos si el archivo existe, que es una operación asincrónica y, por lo tanto, requiere una devolución de llamada. Si el archivo no existe, se envía un mensaje 404 No encontrado al usuario y la función regresa. De lo contrario, leemos el archivo usando el módulo fs usando la codificación "binaria", y enviamos el archivo al usuario. Si hay un error al leer el archivo, presentamos el mensaje de error al usuario y cerramos la conexión. Como todo esto es asincrónico, el servidor puede atender otras solicitudes mientras lee el archivo desde el disco, sin importar cuán grande sea.

Si ejecuta este ejemplo y navega a http://localhost:8080/path/to/file, ese archivo se mostrará en su navegador.


Paso 4 Un tiempo real Tweet Streamer

Basándonos en nuestro servidor de archivos estático, crearemos un servidor en Node.js que transmite tweets a un cliente que se sirve a través de nuestro servidor de archivos estático. Para comenzar, necesitaremos un módulo adicional en este ejemplo: el módulo events. Node tiene un concepto llamado EventEmitter, que se utiliza para gestionar los detectores de eventos para tareas asincrónicas. Al igual que en jQuery u otro marco de JavaScript del lado del cliente donde vincula a los oyentes de eventos con cosas como clics del mouse y solicitudes de AJAX, Node le permite vincular los oyentes de eventos a muchas cosas, algunas de las cuales ya hemos utilizado. Esto incluye cada operación de E / S, como leer un archivo, escribir un archivo, verificar si existe un archivo, esperar solicitudes HTTP, etc. EventEmitter abstrae la lógica de vincular, desvincular y desencadenar dichos detectores de eventos. Utilizaremos un EventEmitter para notificar a los oyentes cuando se carguen nuevos tweets. Las primeras líneas de nuestro tweet streamer importan todos los módulos requeridos, y define una función para manejar archivos estáticos, que fue tomada de nuestro ejemplo anterior.

Hemos utilizado el módulo http para crear un servidor anteriormente, pero también es posible crear un cliente HTTP utilizando el módulo. Vamos a crear un cliente HTTP para cargar tweets de la línea de tiempo pública de Twitter, que se realiza mediante la función get_tweets.

Primero, creamos un cliente HTTP en el puerto 80 a api.twitter.com, y creamos un nuevo EventEmitter. La función get_tweets crea una solicitud HTTP "GET" para la línea de tiempo pública de Twitter y agrega un detector de eventos que se activará cuando los servidores de Twitter respondan. Debido a que Node.js es asincrónico, los datos en el cuerpo de la respuesta vienen en fragmentos, que son recogidos por el oyente de "datos" de la respuesta. Este oyente simplemente agrega el fragmento a la variable body. Una vez que todos los fragmentos han ingresado, se activa el oyente "final" y analizamos los datos JSON entrantes. Si se devuelve más de un tweet, emit el evento "tweets" en nuestro tweet_emitter, y pasamos el conjunto de nuevos tweets. Esto provocará que todos los oyentes de eventos estén escuchando el evento "tweets" y envíen los nuevos tweets a cada cliente. Retiramos los nuevos tweets cada cinco segundos, usando setInterval.

Finalmente, necesitamos crear el servidor HTTP para manejar las solicitudes.

Tal como lo hicimos con nuestro servidor de archivos estático, creamos un servidor HTTP que escucha en el puerto 8080. Analizamos la URL solicitada, y si la URL es igual a "/stream", lo gestionaremos; de lo contrario, la rechazaremos a nuestro servidor de archivos estáticos. Streaming consiste en crear un oyente para escuchar nuevos tweets en nuestro tweet_emitter, que será activado por nuestra función get_tweets. También creamos un temporizador para eliminar las solicitudes que duran más de 10 segundos enviándoles una matriz vacía. Cuando aparecen nuevos tweets, enviamos los tweets como datos JSON y borramos el temporizador. Verás cómo funciona esto mejor después de ver el código del lado del cliente, que está debajo. Guárdelo como test.html en el mismo directorio que el lado del servidor JavaScript.

Aquí, tenemos una página HTML simple que importa la biblioteca jQuery y define una lista desordenada para poner los tweets. en Twitter. ¡Feliz saludo! Nuestro JavaScript del lado del cliente almacena en caché la lista de tweets y ejecuta la función load_tweets después de un segundo. Esto le da al navegador tiempo suficiente para terminar de cargar la página antes de comenzar la solicitud de AJAX al servidor.  La función load_tweets es muy simple: utiliza la función getJSON de jQuery para cargar /stream. Cuando aparece una respuesta, examinamos todos los tweets y los anteponemos a la lista de tweets. Luego, llamamos load_tweets nuevamente. Esto efectivamente crea un ciclo que carga nuevos tweets, que se agota luego de diez segundos debido al tiempo de espera en el servidor. Cada vez que hay nuevos tweets, se envían al cliente, que mantiene una conexión continua con el servidor. Esta técnica se llama larga encuesta.

Si ejecuta el servidor usando el node y va a http://localhost:8080/test.html, verá la corriente de línea de tiempo pública de Twitter en su navegador.


Próximos pasos

Node.js es una tecnología muy interesante que facilita la creación de aplicaciones de alto rendimiento en tiempo real. Espero que pueda ver su beneficio, y puede usarlo en algunas de sus propias aplicaciones. Debido al excelente sistema de módulos de Node, es fácil usar código preescrito en su aplicación, y hay muchos módulos de terceros disponibles para casi todo, incluidas capas de conexión de base de datos, motores de plantillas, clientes de correo e incluso marcos enteros que conectan todos estos cosas juntos. Puede ver una lista completa de módulos en la wiki de Node.js, y se pueden encontrar más tutoriales de Node en Cómo hacerlo. También recomendaría que vean un video de JSConf, en el que Ryan Dahl, el creador de Node, describe la filosofía de diseño detrás de Node. Eso está disponible.

Espero que hayas disfrutado este tutorial. Si tiene algún comentario, puede dejar uno aquí o enviarme un mensaje en Twitter ¡Feliz Node!

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.