Node.js para principiantes

La programación dirigida por eventos puede ser abrumadora para los principiantes, lo que puede hacer que sea difícil comenzar con Node.js. Pero no dejes que eso te desanime; En este artículo, te enseñaré algunos de los conceptos básicos de Node.js y explicaré por qué se ha vuelto tan popular..

Si necesita ayuda, siempre puede ponerse en contacto con uno de los expertos en JavaScript de Envato Studio. Ya sea que necesite una corrección de errores o una nueva función agregada, encontrará un desarrollador de JavaScript con experiencia para ayudarlo.

Aprender JavaScript: la guía completa

Hemos creado una guía completa para ayudarlo a aprender JavaScript, ya sea que esté comenzando a trabajar como desarrollador web o si desea explorar temas más avanzados..

Introducción

Para comenzar a utilizar Node.js, primero debe comprender las diferencias entre Node.js y los entornos de scripts tradicionales del servidor (por ejemplo, PHP, Python, Ruby, etc.).

Programación Asíncrona

Node.js utiliza una arquitectura de módulo para simplificar la creación de aplicaciones complejas.

Es probable que esté familiarizado con la programación asíncrona; es, después de todo, la "A" en Ajax. Cada función en Node.js es asíncrona. Por lo tanto, todo lo que normalmente bloquearía el hilo se ejecuta en segundo plano. Esto es lo más importante para recordar acerca de Node.js. Por ejemplo, si está leyendo un archivo en el sistema de archivos, debe especificar una función de devolución de llamada que se ejecuta cuando la operación de lectura ha finalizado.

Estas haciendo todo!

Node.js es solo un entorno, lo que significa que tienes que hacer todo por ti mismo. No hay un servidor HTTP predeterminado, ni ningún servidor para esa materia. Esto puede ser abrumador para los nuevos usuarios, pero la recompensa es una aplicación web de alto rendimiento. Un script maneja toda la comunicación con los clientes. Esto reduce considerablemente la cantidad de recursos utilizados por la aplicación. Por ejemplo, aquí está el código para una aplicación Node.js simple:

var i, a, b, c, max; max = 1000000000; var d = Date.now (); para (i = 0; i < max; i++)  a = 1234 + 5678 + i; b = 1234 * 5678 + i; c = 1234 / 2 + i;  console.log(Date.now() - d);

Y aquí está el equivalente escrito en PHP:

$ a = nulo; $ b = nulo; $ c = nulo; $ i = nulo; $ max = 1000000000; $ inicio = microtiempo (verdadero); para ($ i = 0; $ i < $max; $i++)  $a = 1234 + 5678 + $i; $b = 1234 * 5678 + $i; $c = 1234 / 2 + $i;  var_dump(microtime(true) - $start);

Ahora veamos los números de referencia. La siguiente tabla enumera los tiempos de respuesta, en milisegundos, para estas dos aplicaciones simples:

Número de iteraciones Node.js PHP
100 2.00 0.14
10'000 3.00 10.53
1'000'000 15.00 1119.24
10'000'000 143.00 10621.46
1'000'000'000 11118.00 1036272.19

Ejecuté las dos aplicaciones desde la línea de comandos para que ningún servidor retrasara la ejecución de las aplicaciones. Corrí cada prueba diez veces y promedié los resultados. PHP es notablemente más rápido con una menor cantidad de iteraciones, pero esa ventaja se disuelve rápidamente a medida que aumenta el número de iteraciones. Cuando todo está dicho y hecho, PHP es un 93% más lento que Node.js!

Node.js es rápido, pero necesitarás aprender algunas cosas para usarlo correctamente.

Módulos

Node.js utiliza una arquitectura de módulo para simplificar la creación de aplicaciones complejas. Los módulos son similares a bibliotecas en C, o unidades en Pascal. Cada módulo contiene un conjunto de funciones relacionadas con el "asunto" del módulo. Por ejemplo, el http El módulo contiene funciones específicas de HTTP. Node.js proporciona algunos módulos básicos listos para usar para ayudarlo a acceder a los archivos en el sistema de archivos, crear servidores HTTP y TCP / UDP y realizar otras funciones útiles..

Incluir un módulo es fácil; simplemente llama al exigir() función, como esta:

var http = require ('http');

Node.js es solo un entorno; tienes que hacer todo por ti mismo.

los exigir() La función devuelve la referencia al módulo especificado. En el caso de este código, una referencia a la http módulo se almacena en el http variable.

En el código anterior, pasamos el nombre de un módulo a la exigir() función. Esto hace que Node busque un nodo_módulos carpeta en el directorio de nuestra aplicación, y busque el http módulo en esa carpeta. Si Node no encuentra el nodo_módulos carpeta (o la http módulo dentro de él), luego busca a través del caché global del módulo. También puede especificar un archivo real al pasar una ruta relativa o absoluta, así:

var myModule = require ('./ myModule.js');

Los módulos son piezas encapsuladas de código. El código dentro de un módulo es en su mayoría privado, lo que significa que las funciones y variables definidas dentro de ellos solo son accesibles desde el interior del módulo. Sin embargo, puede exponer funciones y / o variables que se utilizarán fuera del módulo. Para ello, utilice el las exportaciones Objete y complete sus propiedades y métodos con las piezas de código que desea exponer. Considere el siguiente módulo como ejemplo:

var PI = Math.PI; exports.area = function (r) return PI * r * r; ; exports.circumference = function (r) return 2 * PI * r; ;

Este código crea un Pi variable a la que solo se puede acceder mediante el código contenido dentro del módulo; No es accesible fuera del módulo. A continuación, se crean dos funciones en el las exportaciones objeto. Estas funciones son accesibles fuera del módulo porque están definidas en la las exportaciones objeto. Como resultado, Pi Está completamente protegido de las interferencias externas. Por lo tanto, puede estar seguro de que zona() y circunferencia() siempre se comportará como debería (siempre que se proporcione un valor para el r parámetro).

Alcance global

Node es un entorno de JavaScript que se ejecuta en el motor de JavaScript V8 de Google. Como tal, debemos seguir las mejores prácticas que utilizamos para el desarrollo del lado del cliente. Por ejemplo, debemos evitar poner cualquier cosa en el ámbito global. Eso, sin embargo, no siempre es posible. El alcance global en Nodo es GLOBAL (Opuesto a ventana en el navegador), y puede crear fácilmente una variable global de función omitiendo la var palabra clave, como esta:

variable global = 1; globalFunction = function () …;

Una vez más, los globales deben evitarse siempre que sea posible. Así que ten cuidado y recuerda usar var al declarar una variable.

Instalación

Naturalmente, necesitamos instalar Node antes de poder escribir y ejecutar una aplicación. La instalación es sencilla si utiliza Windows u OS X; El sitio web nodejs.org ofrece instaladores para esos sistemas operativos. Para Linux, use cualquier gestor de paquetes. Abre tu terminal y escribe:

sudo apt-get update sudo apt-get install nodo

o:

actualización de sudo aptitude sudo aptitude install node

Node.js está en repositorios sid; Es posible que necesite agregarlos a su lista de fuentes:

sudo echo deb http://ftp.us.debian.org/debian/ sid main> /etc/apt/sources.list.d/sid.list

Pero tenga en cuenta que la instalación de paquetes sid en sistemas más antiguos puede dañar su sistema. Ten cuidado, y quitar /etc/apt/sources.list.d/sid.list después de que termine de instalar Node.

Instalación de nuevos módulos

Node.js tiene un administrador de paquetes, llamado Node Package Manager (NPM). Se instala automáticamente con Node.js, y utiliza NPM para instalar nuevos módulos. Para instalar un módulo, abra su terminal / línea de comando, navegue a la carpeta deseada y ejecute el siguiente comando:

npm install module_name

No importa qué sistema operativo tengas; El comando anterior instalará el módulo que especifique en lugar de Nombre del módulo.

La aplicación Hello World

Naturalmente, nuestro primer script Node.js imprimirá el texto '¡Hola Mundo!' a la consola. Crea un archivo, llamado hola.js, y escriba el siguiente código:

console.log ('Hello World!');

Ahora vamos a ejecutar el script. Abra el terminal / línea de comando, navegue a la carpeta que contiene hola.js, y ejecuta el siguiente comando:

nodo hello.js

Debería ver '¡Hola Mundo!' mostrado en la consola.

Servidor HTTP

Vamos a pasar a una aplicación más avanzada; No es tan complicado como puedes pensar. Vamos a empezar con el siguiente código. Lee los comentarios y luego la explicación a continuación:

// Incluir módulo http. var http = require ("http"); // Crear el servidor. Función pasada como parámetro se llama en cada solicitud realizada. // la variable de solicitud contiene todos los parámetros de solicitud // la variable de respuesta le permite hacer cualquier cosa con la respuesta enviada al cliente. http.createServer (función (solicitud, respuesta) // Adjuntar escucha en el evento final. // Este evento se llama cuando el cliente envía todos los datos y está esperando la respuesta. request.on ("end", function () // Escriba encabezados en la respuesta. // 200 es un código de estado HTTP (este significa éxito) // El segundo parámetro contiene campos de encabezado en el objeto // Estamos enviando texto sin formato, por lo que Content-Type debería ser text / plain response.writeHead , 'Content-Type': 'text / plain'); // Enviar datos y finalizar la respuesta. Response.end ('Hello HTTP!');); // Listen en el puerto 8080.). Listen (8080);

Este código es muy simple. Puede enviar más datos al cliente utilizando el response.write () Método, pero hay que llamarlo antes de llamar. respuesta.end (). Guarde este código como http.js y escriba esto en su consola:

nodo http.js

Abre tu navegador y navega hasta http: // localhost: 8080. Deberías ver el texto "Hola HTTP!" en la pagina.

Manejo de los parámetros de URL

Como mencioné anteriormente, tenemos que hacer todo nosotros mismos en Nodo, incluido el análisis de los argumentos de solicitud. Esto es, sin embargo, bastante simple. Echa un vistazo al siguiente código:

// Incluir el módulo http, var http = require ("http"), // And url module, que es muy útil para analizar los parámetros de solicitud. url = require ("url"); // Crear el servidor. http.createServer (function (request, response) // Adjuntar lister en el evento final. request.on ('end', function () // Analiza la solicitud de argumentos y los almacena en la variable _get. // Esta función analiza la url desde la solicitud y devuelve la representación del objeto. var _get = url.parse (request.url, true) .query; // Escribir encabezados en la respuesta. response.writeHead (200, 'Content-Type': 'text / plain '); // Enviar datos y finalizar respuesta. Response.end (' Aquí están sus datos: '+ _get [' data ']);); // Escuche en el puerto 8080.). Escuche (8080) ;

Este código utiliza el analizar gramaticalmente() método de la url módulo, un módulo central de Node.js, para convertir la URL de la solicitud en un objeto. El objeto devuelto tiene una consulta propiedad, que recupera los parámetros de la URL. Guardar este archivo como get.js y ejecutarlo con el siguiente comando:

nodo get.js

Luego, navega a http: // localhost: 8080 /? data = put_some_text_here en tu navegador Naturalmente, cambiando el valor de la datos parámetro no romperá el guión.

Leer y escribir archivos

Para administrar archivos en Nodo, usamos el fs módulo (un módulo de núcleo). Leemos y escribimos archivos utilizando el fs.readFile () y fs.writeFile () Métodos, respectivamente. Explicaré los argumentos después del siguiente código:

// Incluir el módulo http, var http = require ("http"), // Y el módulo mysql que acaba de instalar. fs = require ("fs"); // Crear el servidor http. http.createServer (function (request, response) // Adjuntar lister en el evento final. request.on ("end", function () // Lea el archivo. fs.readFile ("test.txt", 'utf- 8 ', función (error, datos) // Escribir encabezados. Response.writeHead (200, ' Content-Type ':' text / plain '); // Incrementar el número obtenido del archivo. Data = parseInt (data ) + 1; // Escriba el número incrementado en el archivo. Fs.writeFile ('test.txt', datos); // Termine la respuesta con un mensaje agradable. Response.end ('Esta página se actualizó' + datos + 'veces! '););); // Escuche en el puerto 8080.). Listen (8080);

Node.js tiene un administrador de paquetes, llamado Node Package Manager (NPM). Se instala automáticamente con Node.js

Guardar esto como archivos.js. Antes de ejecutar este script, cree un archivo llamado test.txt en el mismo directorio que archivos.js.

Este código demuestra la fs.readFile () y fs.writeFile () metodos Cada vez que el servidor recibe una solicitud, el script lee un número del archivo, incrementa el número y escribe el nuevo número en el archivo. los fs.readFile () el método acepta tres argumentos: el nombre del archivo para leer, la codificación esperada y la función de devolución de llamada.

Escribir en el archivo, al menos en este caso, es mucho más simple. No tenemos que esperar ningún resultado, aunque debería verificar si hay errores en una aplicación real. los fs.writeFile () El método acepta el nombre del archivo y los datos como argumentos. También acepta los argumentos tercero y cuarto (ambos son opcionales) para especificar la función de codificación y devolución de llamada, respectivamente.

Ahora, ejecutemos este script con el siguiente comando:

archivos de nodo.js

Ábrelo en el navegador (http: // localhost: 8080) y refrescarlo unas cuantas veces. Ahora, puede pensar que hay un error en el código porque parece incrementarse en dos. Esto no es un error. Cada vez que solicita esta URL, se envían dos solicitudes al servidor. La primera solicitud la realiza automáticamente el navegador, que solicita favicon.ico, y por supuesto, la segunda solicitud es para la URL (http: // localhost: 8080).

Aunque este comportamiento no es técnicamente un error, es un comportamiento que no queremos. Podemos arreglar esto fácilmente revisando la URL de solicitud. Aquí está el código revisado:

// Incluir el módulo http, var http = require ("http"), // Y el módulo mysql que acaba de instalar. fs = require ("fs"); // Crear el servidor http. http.createServer (function (request, response) // Adjuntar listener en el evento final. request.on ('end', function () // Compruebe si el usuario solicita / if (request.url == '/')  // Leer el archivo. Fs.readFile ('test.txt', 'utf-8', función (error, datos) // Escribir encabezados. Response.writeHead (200, 'Content-Type': 'text / plain '); // Incrementa el número obtenido del archivo. data = parseInt (data) + 1; // Escribe el número incrementado en el archivo. fs.writeFile (' test.txt ', data); // Finaliza la respuesta con algunos bonito mensaje. response.end ('Esta página se actualizó' + datos + 'veces!');); else // Indique que no se encontró el archivo solicitado. response.writeHead (404); // Y solicitud final sin enviar ningún dato. response.end ();); // Escuche en el puerto 8080.). listen (8080);

Pruébalo ahora; debería funcionar como se esperaba.

Accediendo a las bases de datos MySQL

La mayoría de las tecnologías de servidor tradicionales tienen un medio incorporado para conectarse y consultar una base de datos. Con Node.js, tienes que instalar una biblioteca. Para este tutorial, he elegido el estable y fácil de usar nodo-mysql. El nombre completo de este módulo es [email protected] (Todo después de la @ es el número de versión). Abra su consola, navegue al directorio donde ha almacenado sus scripts y ejecute el siguiente comando:

npm instala [email protected]

Esto descarga e instala el módulo, y también crea el nodo_módulos carpeta en el directorio actual. Ahora veamos cómo podemos usar esto en nuestro código; Vea el siguiente ejemplo:

// Incluya el módulo http, var http = require ('http'), // Y el módulo mysql que acaba de instalar. mysql = require ("mysql"); // Crea la conexión. // Los datos están predeterminados para la nueva instalación de mysql y deben cambiarse de acuerdo con su configuración. var connection = mysql.createConnection (usuario: "root", contraseña: "", base de datos: "db_name"); // Crear el servidor http. http.createServer (function (request, response) // Adjuntar un detector al evento final. request.on ('end', function () // Consultar la base de datos. connection.query ('SELECT * FROM your_table;', function (error, filas, campos) response.writeHead (200, 'Content-Type': 'x-application / json'); // Enviar datos como cadena JSON. // La variable Filas contiene el resultado de la consulta. response.end (JSON.stringify (rows)););); // Listen en el puerto 8080.). listen (8080);

Consultar la base de datos con esta biblioteca es fácil; simplemente ingrese la cadena de consulta y la función de devolución de llamada. En una aplicación real, debe comprobar si hubo errores (el error el parámetro no será indefinido si ocurrieron errores) y envíe los códigos de respuesta dependiendo del éxito o fracaso de la consulta. También tenga en cuenta que hemos establecido el Tipo de contenido a x-application / json, que es el tipo MIME válido para JSON. los filas parámetro contiene el resultado de la consulta, y simplemente convertimos los datos en filas a una estructura JSON utilizando el JSON.stringify () método.

Guardar este archivo como mysql.js, y ejecutarlo (si tiene instalado MySQL, es decir):

nodo mysql.js

Navegar a http: // localhost: 8080 en su navegador, y se le pedirá que descargue el archivo con formato JSON.

Conclusión

Cada función en Node.js es asíncrona..

Node.js requiere trabajo adicional, pero la recompensa de una aplicación rápida y robusta vale la pena. Si no desea hacer todo en el nivel más bajo, siempre puede elegir un marco, como> Express, para facilitar el desarrollo de aplicaciones..

Node.js es una tecnología prometedora y una excelente opción para una aplicación de alta carga. Ha sido probado por corporaciones, como Microsoft, eBay y Yahoo. Si no está seguro de alojar su sitio web / aplicación, siempre puede usar una solución VPS barata o varios servicios basados ​​en la nube, como Microsoft Azure y Amazon EC2. Ambos servicios proporcionan entornos escalables a un precio razonable.

No olvides comentar si tienes alguna duda.!