Aprende Node.js con aplicaciones reales

¿Cómo funciona Node.js?

Primer programa en Node.js

Antes de empezar a trabajar se debe seleccionar un directorio de trabajo, en los sistemas Unix es muy sencillo llegar al directorio del usuario con el siguiente comando:

cd ~

Para conocer la ruta del directorio donde está localizado utilizar el comando pwd.

A continuación crear el directorio llamado “greeting” e ingresar a él con el siguiente comando:

mkdir greeting && cd greeting

Se creará una aplicación que cada vez que se ejecute salude al usuario e indique el año actual; por lo tanto, en el directorio de trabajo se crea un archivo llamado index.js con el siguiente contenido:

const name = 'Gustavo';
const year = new Date().getFullYear();

console.log(`Hey ${name}, we are in ${year}`);

En el fragmento de código anterior se utiliza la interpolación de variables con los Template Strings de JavaScript.

Ejecutar rl programa con el siguiente comando:

node index.js

Felicitaciones has creado tu primer programa en Node.js.

¿Que es REPL?

En la sección anterior se observó cómo ejecutar un archivo de JavaScript con Node.js, con el siguiente comando:

node index.js

Utilizando el ejecutable node con el argumento de index.js. Pero Node.js no solamente se puede utilizar para ejecutar aplicaciones, también se puede utilizar como un programa de línea de comandos para evaluar expresiones; esto se llama REPL (Read Eval Print Loop). Se ejecuta de la siguiente manera:

node

Se pueden escribir expresiones como: 1+1 y presionar la tecla ENTER o expresiones como "A" === "A" y presionar la tecla ENTER. Como su nombre lo dice, por cada uno de los comandos introducidos, realiza las siguientes operaciones:

  1. Lee la expresión
  2. Evalúa la expresión
  3. Imprime el resultado
  4. Repite el proceso

Para salir de este ciclo se puede utilizar la combinación de teclas Ctrl+C dos veces, también se puede utilizar la combinación de teclas CTRL+D o la expresión process.exit(0).

Inclusive se puede escribir un programa completo.

node (ENTER)
var a = 0; (ENTER)
if (a === 0) { (ENTER)
console.log("a == 0"); (ENTER)
} (ENTER)

La palabra ENTER se coloca para indicar cuándo se presiona dicha tecla

Se puede notar que al escribir la expresión if (a === 0) { y se presiona la tecla ENTER; no se evalúa inmediatamente, ya que en la presencia del { indica el comienzo de un bloque y al ingresar } se termina evaluando todo el bloque.

Para mayor comodidad, se puede introducir el comando .editor para habilitar un editor en la línea de comando para crear el programa con mayor facilidad:

node
> .editor
// Entering editor mode (^D to finish, ^C to cancel)

Todos los comandos listados a continuación se pueden utilizar dentro de la línea de comandos de REPL y NO en la línea de comandos del sistema:

  • La tecla TAB muestra un listado de todas las funciones disponibles.
  • El comando .break o CTRL+C permite añadir una nueva línea.
  • Una vez se finaliza la sesión, todas las variables se pierden, pero se puede guardar en un archivo con el siguiente comando .save [nombre-de-archivo].
  • De la misma manera, se pueden cargar nuevamente con el comando .load [nombre-del-archivo].
  • El listado de otros comandos está disponible con el comando .help.

En conclusión, Node REPL es muy útil para probar funcionalidades de manera muy rápida o inclusive depurar un programa.

Más información:

Objeto Global

En una aplicación de Node.js existen varios objetos y funciones globales disponibles en toda la aplicación sin necesidad de incluir ningún módulo. Un ejemplo de estos son:

  • console: Permite imprimir texto en la consola.
  • process: Permite acceder a toda la información del proceso de Node.js que se está ejecutando.
  • __filename_ y __dirname: Se utilizan para obtener información del directorio y archivo que se está ejecutando.
  • module , exports y require: Se utilizan para exportar e importar módulos.

Existe un objeto global llamado de igual forma global. Este objeto en particular es el que se encuentra en el nivel superior del “scope” de cada aplicación de Node.js. Una analogía con el entorno del navegador Web sería el objeto window. Al tener esta característica muchas veces es utilizado para guardar variables y consultarlas en otras partes de la aplicación, lamentablemente esto no es una buena práctica. No es recomendable el uso de variables globales, pues no se puede tener un control total sobre estas, ya que pueden ser sobreescritas en cualquier parte de la aplicación llevando a estados no deseados.

Más información:

Objeto Process

El objeto process provee información acerca del proceso actual en el cual se está ejecutando la aplicación de Node.js. Por lo tanto, es muy importante conocerlo, ya que se puede obtener información tal como: versión de Node.js, librerías core, directorio de usuario, directorio temporal, el objeto PATH, entre otros.

Para ver la información que contiene el objeto process:

node -p "process"

La bandera -p evalúa e imprime por pantalla la expresión que se introduce como argumento

Como se puede observar tiene bastante información, pero se puede acceder directamente a la información específica, ya que en realidad dentro de la aplicación de Node.js es un objeto de JavaScript. Un ejemplo sería la información acerca de las librerías core:

node -p "process.versions"

Más información:

Argumentos de línea de comando

Cada vez que se ejecuta un programa con Node.js, este se encarga de procesar los argumentos y guardarlos en el objeto process.argv.

En la aplicación creada de greeting se edita el contenido del archivo index.js y se añade la siguiente línea al final:

console.log(process.argv);

Se ejecuta la aplicación con el siguiente comando:

node index.js

El siguiente es el resultado en la consola:

[ '/Users/.../.nvm/versions/node/.../bin/node',
'/Users/.../02-greeting/index.js' ]

Se ha modificado la ruta de los directorios para omitir información no relevante y reemplazado con tres puntos seguidos (…)

El objeto process.argv es un Array que en cada posición almacena cada argumento, en este caso el primero, es la ubicación del ejecutable de Node.js y, el segundo, es el archivo de entrada de la aplicación. Los argumentos se interpretan, ya que van separados por espacios.

Modificar el archivo index.js de la siguiente manera:

const args = process.argv.slice(2);
const [name = 'Friend'] = args;
const hour = new Date().getHours();

// Ask for hours range
if (hour >= 6 && hour < 12) {
  console.log(`Good morning ${name}`);
} else if (hour >= 12 && hour < 18) {
  console.log(`Good afternoon ${name}`);
} else if (hour >= 18 && hour < 23) {
  console.log(`Good evening ${name}`);
} else {
  console.log(`Good night ${name}`);
}

A continuación se describen los cambios:

  1. Se almacena en la variable args una porción del Array de argumentos originalmente de la propiedad argv, se ignoran los dos (2) primeros con el método slice.
  2. Se utiliza Array Destructuring para obtener la primera posición del Array y si esta no existe se le asigna el valor por defecto de "Friend".
  3. Se obtiene la hora local.
  4. Finalmente, dependiendo del valor de la hora local, se imprime un mensaje saludando con el nombre de la persona que se envió como argumento en la ejecución del programa.

Se ejecuta la aplicación con el siguiente comando:

node index.js Gustavo