Аргументы командной строки в Node.js

Что такое аргументы командной строки (Command Line Arguments)?
Аргументы командной строки — это строки которые используются для передачи дополнительной информации перед запуском программы из терминала (CLI) операционной системы. Аргументы командной строки как правило содержат параметры конфигурации приложения, например, адрес порта HTTP сервера.
В большинстве случаев аргументы передаются после названия программы. Пример синтаксиса можно увидеть ниже:

$ [runtime] [program_name] [arg-1 arg-2 arg-3 ... arg-n]

Параметром runtime может быть все что запускает приложение/скрипт, например, php, python, node, npm. В большинстве случаев аргументы должны быть разделены пробелом, хотя есть такие среды выполнения, которые используют запятые для различения нескольких параметров. Также, в зависимости от программы, аргументы можно передавать в формате ключ-значение.

Зачем использовать аргументы командной строки?

Среди основных преимуществ использования аргументов командной строки, можно выделить:
— информацию в приложении можно передать до его запуска. Это очень удобно при использовании большого количества конфигурационных параметров.
— аргументы командной строки передаются как строки в вашу программу. Тип данных String очень легко можно конвертировать в другой тип, что делает эти аргументы универсальными.
— можно передавать неограниченное количество параметров
— аргументы командной строки используются в связке с скриптами и пакетными файлами (batch file), что особенно полезно при автоматических тестах.

Но есть один минус такого похода — довольно сложно научится использовать аргументы командной строки, если у вас не много опыта работы с терминалом.

Передача аргументов командной строки в Node.js

Как и другие языки, приложения на Node.js также принимают аргументы командной строки. Есть встроенная обработка таких параметров, но для более удобного использования стоить прибегнуть к сторонним библиотекам.

Использования process.argv
Самым простым способом получения аргументов командной строки в Node.js является их извлечении из массива process.argv. Это глобальный объект, его можно использовать без импорта сторонних библиотек. Просто передайте аргументы в приложение Node.js, и они будут доступны в process.argv.
Массив process.argv — это массив строк. Первым элементом будет ‘node’, вторым имя JavaScript файла, дальше все параметры, переданные при запуске.
Для новичков в программирование стоить отметить тот факт, что в JavaScript индексирование массивов начинается с нуля, как и в многих Си-подобных языках, это значит, что первый элемент будет иметь индекс- 0, последний длина массива минус 1.
Пример вывода параметров командной строки:
// вывод массива process.argv

process.argv.forEach((value,index)=>{
 console.info(value + ': ' + index);
});
$ node runServer.js 5000 prod
//выведет
node: 0
runServer.js: 1
5000: 2
prod: 3

Использование библиотеки minimist

Другим способом получения параметров командной строки в Node.js есть модуль minimist. Он позволяет парсить аргументы из массива process.argv и переводить в их в более легкие для использования ассоциативные массивы. В ассоциативных массивах можно получать элементы через оператора точка, как в обычно JS объектах.
Пример использования minimist:

'use strict';
const minimist=require('minimist');
const arguments =minimist(process.argv.slice(2));
console.log(arguments);
console.log(arguments.paramName);

В коде выше используется метод slice, для удаления не нужных нам первых аргументов. Теперь при передаче параметров мы можем определить ключ по котором его можно будет получить. Так как в примере было использовано поле paramName, при запуске скрипта аргумент стоит передать так -paramName 5000
Пример запуска

$ node minimistTest.js –paramName 5000 -otherParam 127.0.0.1
{ _: [], paramName: '5000', otherParam: 127.0.0.1 }
5000

Модуль minimist не настолько мощный как yargs, описанный ниже, но все же содержит несколько удобных функций, таких как значение по умолчанию и псевдонимы.
Если был задан псевдоним, то при вызове функции можно не передавать полное название, это особенно удобно если вы хотите добавить сокращения.
Использование псевдонимов (alias)

const minimist = require('minimist');
let rawArguments=process.argv.slice(2);
let arguments = minimist(rawArguments, {
    alias: {
        b:'build'
        h: 'help',
        v: 'version'
    }
});

console.log('arguments:', arguments);

Вызов этого скрипта с аргументом -v установит v: true and version: true

$ node minimistTest.js –v
args: { _: [], v: true, version: true,build:true }

Также модуль minimist позволяет задать параметры по умолчанию.

const minimist = require('minimist');
let rawArguments=process.argv.slice(2);
let arguments = minimist(rawArguments, {
  default: {
          databaseUrl: 'localhost:3306',
          password:'some pass'
  }
});
console.log('arguments:', arguments);

Запуск этого скрипта без параметров -databaseUrl и -password, установит значение по умолчанию для этих параметров

$ node bin/www.js
args: { _: [], databaseUrl: 'localhost:3306', password: 'some pass' }
Использование модуля yargs

Модуль yargs также является библиотекой для обработки аргументов командной строки. Он позволяет передавать параметры в формате ключ/значение и последующее получение по ключу.

Для установки модуля yargs нужно сначала его установить

$ npm install yargs --save-dev

Напишем простой скрипт

const arguments = require('yargs').argv;
console.log('Port: ' + args.port);

В коде выше значение параметра port выводится в консоль. Если при запуске не передать значения будет undefined.
Пример запуска

 $ node yargsTest.js --port=3000
 Port: 3000

Среди полезных функций модуля yargs стоит выделить метод .command(), который позволяет создавать, и вызвать функции Node.js из командной строки. Рассмотрим пример использования этого метода:

 const arguments= require('yargs')
       .command('dump_db', 'create database dump', (args) => {}, (arguments) => {
                   console.log('Creating database dump started...');
                   // Run your code here
            }).argv;
 

Запуск этого скрипта с параметром «dump_db» вызовет функцию которая была передана в инициализации. Также можно задать аргументы для этой функции, например, имя файла в который нужно записать backup базы даних.

 $ node utils.js  dump_db --path=/var/www/dump
 Creating database dump started...
Заключение

Изменение параметров конфигурации происходит довольно часто, и чтобы не каждый раз не вносить правки в код, стоит для установки этих параметров стоит использовать аргументы командной строки. Что обеспечит гибкость и лёгкость установки/запуска приложение. Хотя Node.js предлагает базовую функциональность обработки аргументов командой строки из коробки, для более сложных задач стоит использовать сторонние библиотек такие как minimist и yargs.