Hoy · Hoja de ruta
- 1. Aprende: Cómo recibe datos un programa de terminal y cómo comunica su resultado.
- 2. Haz: Un programa que hace cosas distintas según cómo lo llames.
- 3. Comprueba: Devuelve el código de salida correcto y no imprime secretos.
Antes de empezar · 5 minutos, sin apuntes
- ¿Cómo le pasarías un dato a un programa que no tiene interfaz?
- ¿Dónde guardarías una contraseña de base de datos?
- ¿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
- Escribe
src/cli.jsque acepte los comandoslistar,buscaryayuda. - Si no se pasa comando, muestra la ayuda y termina con código 1.
- Lee de una variable de entorno la ruta del fichero de datos, con un valor por defecto.
- Convierte y valida los argumentos numéricos.
- Comprueba el código de salida tras cada ejecución.
- Crea
.env.exampley añade.enval.gitignore.
--formato=json.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
- ¿Por qué se descartan las dos primeras posiciones de
process.argv? - ¿Qué significa un código de salida distinto de cero?
- ¿Qué se sube al repositorio:
.envo.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.