← Node.js: JavaScript fuera del navegador

Sesión 2 · Semana 1

Argumentos, entorno y salida

Hoy · Hoja de ruta

  1. 1. Aprende: Cómo recibe datos un programa de terminal y cómo comunica su resultado.
  2. 2. Haz: Un programa que hace cosas distintas según cómo lo llames.
  3. 3. Comprueba: Devuelve el código de salida correcto y no imprime secretos.

Antes de empezar · 5 minutos, sin apuntes

  1. ¿Cómo le pasarías un dato a un programa que no tiene interfaz?
  2. ¿Dónde guardarías una contraseña de base de datos?
  3. ¿Cómo sabe otro programa si el tuyo ha terminado bien?

Argumentos

node src/cli.js listar
node src/cli.js buscar teclado
node src/cli.js añadir "Ratón vertical" 39.9
const [, , comando, ...argumentos] = process.argv;

console.log(comando);      // "buscar"
console.log(argumentos);   // ["teclado"]

Las dos primeras posiciones son siempre el ejecutable y el fichero, por eso se descartan. Y, como todo lo que entra desde fuera, los argumentos son texto: un precio hay que convertirlo y comprobarlo, igual que hacías con los campos de formulario.

Variables de entorno

const puerto = Number(process.env.PUERTO ?? 3000);
const entorno = process.env.NODE_ENV ?? "development";

Sus valores se asignan en el arranque. El procedimiento depende de la terminal, y es una de las cosas que más tiempo hacen perder en clase:

PUERTO=4000 node src/servidor.js          # Git Bash, macOS, Linux
$env:PUERTO="4000"; node src/servidor.js   PowerShell
set PUERTO=4000 && node src/servidor.js    cmd de Windows

Lo que cambia entre máquinas va en el entorno

El puerto, la ruta de los datos, la dirección de la base de datos y cualquier clave. Van fuera del código porque cambian entre tu portátil, el aula y el servidor real, y porque una clave escrita en el código acaba, tarde o temprano, en un repositorio.

Nota además el ?? 3000: un valor por defecto razonable para que el programa arranque sin configurar nada. El que no debe tener valor por defecto es un secreto: si falta, el programa debe negarse a arrancar.

Por eso, en cuanto haya más de una variable, se pasan por fichero. Desde Node 20 se puede cargar un .env sin instalar nada, y la orden es idéntica en las tres terminales:

node --env-file=.env src/servidor.js

Al repositorio se incorpora .env.example, con las claves y sin los valores. El .env real va al .gitignore.

Entrada y salida

console.log("Resultado");      // salida estándar
console.error("Ha fallado");   // salida de error

process.exit(0);   // todo bien
process.exit(1);   // ha fallado

Código de salida

El número con el que termina un programa. Cero significa éxito; cualquier otro, fallo. Es como se enteran las herramientas que encadenan programas —un script, un sistema de integración continua— de si deben seguir o pararse.

Separar console.log de console.error importa por lo mismo: permite que quien use tu programa redirija los resultados a un fichero y siga viendo los errores.

Tarea 2 · Un programa configurable

  1. Escribe src/cli.js que acepte los comandos listar, buscar y ayuda.
  2. Si no se pasa comando, muestra la ayuda y termina con código 1.
  3. Lee de una variable de entorno la ruta del fichero de datos, con un valor por defecto.
  4. Convierte y valida los argumentos numéricos.
  5. Comprueba el código de salida tras cada ejecución.
  6. Crea .env.example y añade .env al .gitignore.
Objetivo mínimoTres comandos, ayuda, y códigos de salida correctos.
Si lo tienesAcepta opciones con guiones, como --formato=json.
RetoHaz que el programa se niegue a arrancar si falta una variable obligatoria, con un mensaje claro.

Checkpoint · fin de la sesión 2

  • Lees argumentos y los conviertes al leerlos.
  • La configuración vive en el entorno, no en el código.
  • Distingues salida estándar de salida de error.
  • Terminas con el código de salida adecuado.

Antes de cerrar · 2 minutos, sin mirar

  1. ¿Por qué se descartan las dos primeras posiciones de process.argv?
  2. ¿Qué significa un código de salida distinto de cero?
  3. ¿Qué se sube al repositorio: .env o .env.example?
Ver respuestas

1 · Porque son el ejecutable de Node y la ruta del fichero ejecutado.

2 · Que el programa ha terminado con un fallo.

3 · Solo el de ejemplo, con las claves y sin los valores reales.