Dominá el objeto process en Node.js: argv, env, códigos de salida y streams stdin/stdout
Introducción
En el ecosistema de Node.js, el objeto global process es la puerta de entrada a todo lo que ocurre fuera del propio proceso de JavaScript: argumentos de línea de comandos, variables de entorno, códigos de salida y los flujos de entrada/salida estándar. Si alguna vez te preguntaste cómo leer los parámetros que le pasás a tu script, cómo configurá variables de entorno o cómo interactuar con la consola de forma programática, este artículo es para vos.
¿A quién va dirigido?
- Desarrolladores que ya manejan JavaScript y quieren dar el siguiente paso en Node.js.
- QA y DevOps que necesitan crear scripts de automatización robustos.
- Estudiantes que buscan entender cómo funciona la capa del sistema operativo desde Node.
¿Qué vas a aprender?
- Cómo usar
process.argvpara leer los argumentos de la línea de comandos. - Acceder y manipular
process.envy entender su alcance. - Emitir códigos de salida con
process.exit()y por qué son importantes. - Trabajar con los streams
process.stdin,process.stdoutyprocess.stderrpara leer y escribir datos. - Buenas prácticas y errores comunes al usar
process.
1. process.argv – Argumentos de la línea de comandos
process.argv es un array que contiene todos los argumentos con los que se invocó el proceso. Los dos primeros elementos son siempre:
process.argv[0]: la ruta al ejecutable de Node.process.argv[1]: la ruta al archivo JavaScript que está siendo ejecutado.
A partir del índice 2 aparecen los parámetros que vos le pasás.
1.1. Ejemplo básico
// archivo: args-demo.js
console.log('argv completo:', process.argv);
console.log('solo argumentos:', process.argv.slice(2));Ejecución esperada
$ node args-demo.js hola mundo --flag=123
argv completo: [ '/usr/local/bin/node', '/ruta/args-demo.js', 'hola', 'mundo', '--flag=123' ]
solo argumentos: [ 'hola',{ 'mundo', '--flag=123' }]1.2. Parseo manual de opciones
Aunque existen librerías como yargs o commander, a veces basta con un parseo rápido:
// archivo: simple-parse.js
const args = process.argv.slice(2);
const options = {};
const positional = [];
args.forEach(arg => {
if (arg.startsWith('--')) {
const [key, value] = arg.slice(2).split('=');
options[key] = value !== undefined ? value : true;
} else {
positional.push(arg);
}
});
console.log('positional:', positional);
console.log('options:', options);Salida esperada
$ node simple-parse.js file.txt --verbose --mode=prod
positional: [ 'file.txt' ]
options: { verbose: true, mode: 'prod' }2. process.env – Variables de entorno
Las variables de entorno son la forma tradicional de pasar configuración al proceso sin hardcodearla. En Node, están accesibles a través de process.env, que es un objeto tipo Dictionary con pares clave/valor, siempre como cadenas.
2.1. Lectura de variables
// archivo: env-demo.js
console.log('NODE_ENV:', process.env.NODE_ENV);
console.log('HOME:', process.env.HOME);Ejemplo de ejecución
$ NODE_ENV=production node env-demo.js
NODE_ENV: production
HOME: /home/juan2.2. Definir variables en tiempo de ejecución
process.env.MI_VARIABLE = 'valor-dinamico';
console.log('MI_VARIABLE:', process.env.MI_VARIABLE);Nota: Cambiar
process.envsolo afecta al proceso actual y a los procesos hijos que pueda lanzar conchild_process.spawn.
2.3. Seguridad y buenas prácticas
- Nunca guardes secretos (API keys, passwords) en código; usá variables de entorno.
- En producción, cargá variables mediante un gestor como
dotenv(solo en desarrollo) o el propio mecanismo del hosting. - Validá la existencia y el formato de las variables al iniciar la aplicación.
3. Códigos de salida con process.exit()
Los códigos de salida (exit codes) indican al sistema operativo cómo terminó el proceso. Por convención:
0→ éxito.- Cualquier otro número (usualmente entre 1‑255) → error.
3.1. Salida explícita
// archivo: exit-demo.js
if (process.argv.length < 3) {
console.error('Falta argumento obligatorio');
process.exit(1); // error de uso
}
console.log('Todo bien');
process.exit(0); // éxito explícito (opcional)Ejemplo de uso
$ node exit-demo.js
Falta argumento obligatorio
$ echo $?
1
$ node exit-demo.js hola
Todo bien
$ echo $?
03.2. Manejo de eventos de salida
Node permite interceptar la señal de salida con el evento process.on('exit', ...).
process.on('exit', code => {
console.log('Proceso finalizó con código', code);
});
process.exit(2);Salida
Proceso finalizó con código 2Importante: Dentro del manejador de
exitno podés realizar operaciones asíncronas; el proceso ya está cerrándose.
4. Streams estándar: stdin, stdout y stderr
Los streams de Node son objetos Readable o Writable. Los tres flujos estándar están disponibles como propiedades de process.
4.1. Lectura de stdin
// archivo: leer-stdin.js
process.stdout.write('Escribí algo y presioná ENTER: ');
process.stdin.setEncoding('utf8');
process.stdin.once('data', data => {
const texto = data.trim();
console.log('Leíste:', texto);
process.exit(0);
});Ejecución
$ node leer-stdin.js
Escribí algo y presioná ENTER: Hola Mundo
Leíste: Hola Mundo4.2. Escritura en stdout y stderr
console.log('Este es un mensaje normal (stdout)');
console.error('Este es un error (stderr)');Redirigir la salida:
$ node script.js > salida.txt 2> errores.txt4.3. Pipe de datos entre procesos
Un caso típico es usar cat para alimentar datos a un script Node:
$ echo 'línea 1
línea 2' | node pipe-demo.js// archivo: pipe-demo.js
process.stdin.setEncoding('utf8');
let acumulado = '';
process.stdin.on('data', chunk => {
acumulado += chunk;
});
process.stdin.on('end', () => {
console.log('Recibí el siguiente texto:
', acumulado);
});Salida esperada
Recibí el siguiente texto:
línea 1
línea 25. Buenas prácticas y errores comunes
| Área | Recomendación | Error típico |
|---|---|---|
| argv | Usa una librería de parsing (yargs, commander) para casos complejos. | Parsear manualmente y olvidar valores con espacios o comillas. |
| env | Valida siempre las variables al iniciar; usa process.env.VAR ?? default. |
Asumir que la variable siempre está definida y romper en producción. |
| exit codes | Documentá los códigos que tu CLI devuelve. Usa 0 para éxito y >0 para fallas. |
Llamar process.exit() sin cerrar recursos (sockets, DB). |
| streams | Siempre establece la codificación (setEncoding('utf8')) cuando lees texto. |
Leer Buffer y olvidarse de convertirlo, produciendo salida extraña. |
| eventos | Usa process.on('SIGINT', ...) para capturar Ctrl+C y cerrar limpiamente. |
No liberar recursos y dejar archivos abiertos al terminar. |
5.1. Manejo de SIGINT y SIGTERM
process.on('SIGINT', () => {
console.log('
Recibí SIGINT, cerrando recursos...');
// cerrar conexiones, etc.
process.exit(0);
});Conclusión
Dominar el objeto global process te permite crear herramientas de línea de comandos potentes, scripts de automatización y servicios que interactúan de forma fluida con el entorno del sistema operativo. Repasamos cómo:
- Leer argumentos con
process.argv. - Acceder a variables de entorno mediante
process.env. - Comunicar el estado de tu aplicación con códigos de salida (
process.exit). - Intercambiar datos mediante los streams estándar (
stdin,stdout,stderr).
Próximos pasos
- Implementá un CLI propio usando
commandery aprovechaprocesspara la lógica base. - Integra manejo de señales (
SIGINT,SIGTERM) para cerrar conexiones a bases de datos. - Explora el módulo
child_processy cómo heredarlo de los streams padre.
Con estos conocimientos, estarás listo para escribir scripts de Node.js que no solo funcionen, sino que también se comporten como herramientas profesionales.
DUGLAS MORENO
Comentarios (0)
Sé el primero en comentar.