¿Cómo obtener los argumentos de la línea de comando en Node.js?
Es bastante común ejecutar aplicaciones desde la línea de comando usando argumentos. Por lo general, no queremos que la aplicación haga lo mismo en cada ejecución, queremos configurar su comportamiento de alguna manera.
En este tutorial, exploraremos cómo podemos manejar los argumentos de la línea de comandos en Node.js.
Tabla de Contenido
¿Qué es argv
en Node.js?
En Node.js todos los argumentos de la línea de comandos recibidos por el shell se entregan al proceso en un arreglo (array) llamado argv
.
¿De dónde proviene el nombre argv?
En inglés, “argv” es la abreviatura de “argument values”.
¿Cómo usar argv
?
Para cada proceso de ejecución Node.js expone un arreglo con los valores de los argumentos de la línea de comandos en forma de process.argv
Si ya tienes instalado Node.js, intenta lo siguiente, es fácil (Si no tienes instalado Node.js, nuestro artículo ¿Cómo instalar Node.js? te explica cómo hacerlo y qué versión escoger).
Crea un archivo llamado main.js
y agrega esta línea:
console.log(process.argv);
Ahora guárdalo e intenta lo siguiente en tu shell:
$ node main.js uno dos=tres cuatro
[ '/Users/leo/.nvm/versions/node/v16.17.1/bin/node',
'/Users/leo/workspace/main.js',
'uno',
'dos=tres',
'cuatro' ]
Ahí lo tienes: un arreglo que contiene los argumentos que pasaste. Observa los elementos:
process.argv[0]
contiene la ruta absoluta al ejecutable que empezó el proceso de Node.jsprocess.argv[1]
contiene la ruta al archivo Javascript en ejecución, en este casomain.js
- los elementos que siguen tiene los valores pasados por la línea de comandos
La ruta al ejecutable y la ruta al archivo de JS en ejecución siempre estarán presentes, incluso si tu programa no toma argumentos propios, el intérprete y la ruta de su secuencia de comandos aún se consideran argumentos para el shell que estás utilizando.
En la mayoría de los casos, no necesitarás la ruta al ejecutable ni la ruta al archivo. ¿Cómo omitir los dos primeros elementos del arreglo?. Intenta lo siguiente en main.js
:
const args = process.argv.slice(2);
console.log('args: ', args);
Aquí método slice
extrae los elementos empezando con el índice 2 y hasta el final del arreglo, luego devuelve una copia del arreglo con los valores extraídos.
Esto produce:
$ node main.js uno dos=tres cuatro
args: [ 'uno', 'dos=tres', 'cuatro' ]
Nota importante en cuanto a los tipos de datos
¿Qué sucede si pasamos valores numéricos o booleanos en la línea de comandos? Intenta la línea de comandos:
$ node main.js 1 2 true false
Esto produce:
args: [ '1', '2', 'true', 'false' ]
¿Puedes notar que sucedió? Puede que esperabas que el 1 y el 2 serían valores de tipo numérico y que true
y false
serían valores de tipo booleano. Pero ¿qué sucede? Los valores contiene process.argv
son de tipo cadena de texto.
Ten presente que process.argv
siempre te devolverá un arreglo con elementos de tipo de cadena de texto, o dicho de otra manera, un array de strings. Esto es precisamente lo que indica la documentación de referencia oficial de la API para Node.js:
¿Cómo usar yargs para simplificar el análisis de argumentos?
Hacer referencia a los argumentos de la línea de comandos por índice de los arreglos no es muy claro y puede convertirse rápidamente en una pesadilla cuando comienzas a trabajar con muchos argumentos y banderas (flags).
Imagina que creaste un servidor y necesitaba muchos argumentos. Ahora tienes que lidiar con algo como:
myApp -h host -p port -r -v -b --quiet -x -o outfile
Algunas banderas necesitan saber lo que viene a continuación, otras no, y la mayoría de las CLI permiten que los usuarios especifiquen argumentos en el orden que quieran 😱
¿Suena como un arreglo divertido de analizar?
Afortunadamente, hay muchos módulos de terceros que hacen que todo esto sea trivial, uno de los cuales es yargs
. Está disponible a través de npm.
Para obtener más información sobre yargs y muchas otras cosas que puede hacer por tus argumentos de línea de comandos, visita el sitio oficial de Yargs.