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

process argv __filename

Людям, приходящим из мира клиентского JavaScript-а, не приходилось иметь дело с командной строкой, но если Вы пишете серверное приложение, то высока вероятность, что придётся столкнуться с консолью в Linux/Unix. (А если вам не повезло, тогда, может быть, даже и с командной строкой MS Windows)

Node.js предоставляет простой способ доступа к сырым данным, передаваемым в командной строке.

В общем случае в командной строке вы можете передать все типы значений:

Список имен: node app.js file1 file2

Пары ключ-значение: node app.js --port NUMBER --dir PATH

Флаги, без значений: node app.js --debug --verbose

Может быть, вам даже захочется передать односимвольные флаги: node app.js -d -v

И их даже можно комбинировать: node app.js -dv --port NUMBER --dir PATH file1 file2

По умолчанию Node.js предоставляет объект process, содержащий элемент argv, который является массивом всех значений, полученных из командной строки:

examples/node/raw_command_line_arguments.js

console.log(process.argv);

Прим.: вам даже не нужно загружать process вручную, так как он загружен по умолчанию.

Запустив команду: node examples/node/raw_command_line_arguments.js -dv --port NUMBER --dir PATH file1 file2

мы получим:

[ 'node',
  '/Users/gabor/work/code-maven.com/examples/node/raw_command_line_arguments.js',
  '-dv',
  '--port',
  'NUMBER',
  '--dir',
  'PATH',
  'file1',
  'file2' ]

Прим.:

Первый элемент - всегда node.

Второй элемент - имя файла для исполнения.

Оставшиеся элементы - значения, переданные в командной строке после имени файла.

В принципе, это просто список всех значений, которые вы ввели в командной строке.

Вы можете пройти циклом по этому массиву с помощью for или forEach и получить эти значения. Способ подойдет для большинства простых случаев, но чаще параметры довольно сложные, и лучше использовать специальную библиотеку.

В качестве примера я нашел вот эти: minimist, nomnom и yargs (fork от node-optimist)

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

Полезные сниппеты для скриптов, работающих из командной строки

Когда вам не нужно обрабатывать множество аргументов командной строки, но вы все еще хотите быть уверенными, что пользователь передал какое-то значение, то можете использовать следующий прием:

examples/node/argv.js

if (process.argv.length <= 2) {
    console.log("Usage: " + __filename + " SOME_PARAM");
    process.exit(-1);
}

var param = process.argv[2];

console.log('Param: ' + param);



В этом примере мы проверяем, что количество элементов в массиве process.argv меньше или равно 2. Я не знаю, может ли оно вообще быть меньше 2, но если оно равно 2, тогда мы точно знаем, что пользователь не передал никаких параметров в командной строке. Затем мы выводим строку "Usage: ", имя нашего файла (__filename содержит имя текущего файла) и некоторую информацию о том, чего мы ожидаем получить от пользователя. Возможно, вместо фразы " SOME_PARAM" вы захотите написать что-то более конкретное. К примеру, "MACHINE_NAME", если нужно указать имя машины, или "URL", если нужно указать URL.

Затем мы вызываем команду exit, чтобы завершить работу, так как больше нет смысла продолжать выполнение программы, не получив необходимых параметров.

Остальная часть программы, конечно, может быть такой, как вы хотите. В нашем случае, дальше есть только console.log('Param: ' + param); для индикации, что выполнение дошло до этого места.

Вот так это работает:

$ node argv.js 
Usage: /home/gabor/code-maven/examples/node/argv.js SOME_PARAM
$ node argv.js hello
Param: hello

Related Pages

Как получить системную информацию о файле или директории в Node.js (stat)
Делаем веб-клиент (сканер) с помощью Node.js

Author

Gabor Szabo (szabgab) Gabor Szabo