Как передать аргументы командной строки в программу Node.js? - PullRequest
2169 голосов
/ 04 декабря 2010

У меня есть веб-сервер, написанный на Node.js , и я хотел бы запустить его с определенной папкой. Я не уверен, как получить доступ к аргументам в JavaScript. Я запускаю узел так:

$ node server.js folder

здесь server.js - это код моего сервера. Справка Node.js говорит, что это возможно:

$ node -h
Usage: node [options] script.js [arguments]

Как мне получить доступ к этим аргументам в JavaScript? Почему-то мне не удалось найти эту информацию в Интернете.

Ответы [ 29 ]

2807 голосов
/ 04 декабря 2010

Стандартный метод (без библиотеки)

Аргументы хранятся в process.argv

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

process.argv - массив, содержащий аргументы командной строки.Первым элементом будет «узел», вторым элементом будет имя файла JavaScript.Следующими элементами будут любые дополнительные аргументы командной строки.

// print process.argv
process.argv.forEach(function (val, index, array) {
  console.log(index + ': ' + val);
});

Это сгенерирует:

$ node process-2.js one two=three four
0: node
1: /Users/mjr/work/node/process-2.js
2: one
3: two=three
4: four
599 голосов
/ 24 апреля 2011

Чтобы нормализовать аргументы, которые получала бы обычная функция javascript, я делаю это в своих сценариях оболочки node.js:

var args = process.argv.slice(2);

Обратите внимание, что первый аргумент - это обычно путь к nodejs, а второйarg - это местоположение скрипта, который вы выполняете.

313 голосов
/ 08 июля 2014

Обновленный правильный ответ для этого, чтобы использовать библиотеку minimist . Раньше мы использовали node-optimist , но с тех пор он устарел.

Вот пример того, как его использовать, взятый прямо из минимистической документации:

var argv = require('minimist')(process.argv.slice(2));
console.dir(argv);

-

$ node example/parse.js -a beep -b boop
{ _: [], a: 'beep', b: 'boop' }

-

$ node example/parse.js -x 3 -y 4 -n5 -abc --beep=boop foo bar baz
{ _: [ 'foo', 'bar', 'baz' ],
  x: 3,
  y: 4,
  n: 5,
  a: true,
  b: true,
  c: true,
  beep: 'boop' }
278 голосов
/ 14 января 2016

2018 ответ на основе текущих тенденций в дикой природе:


Разбор аргументов ванильного javascript:

const args = process.argv;
console.log(args);

Возвращает:

$ node server.js one two=three four
['node', '/home/server.js', 'one', 'two=three', 'four']

Официальные документы


Наиболее используемые пакеты NPM для разбора аргументов:

Минимист : для минимального разбора аргумента.

Commander.js : Наиболее распространенный модуль для разбора аргументов.

Мяу : более легкая альтернатива Commander.js

Яргс : более сложный анализ аргументов (тяжелый).

Vorpal.js : зрелые / интерактивные приложения командной строки с разбором аргументов.

116 голосов
/ 04 июля 2011

Optimist (node-optimist)

Извлечение библиотека оптимистов , это намного лучше, чем анализ параметров командной строки вручную.

Обновление

Оптимист устарел.Попробуйте yargs , который является активным форком оптимиста.

86 голосов
/ 12 декабря 2013

Несколько отличных ответов здесь, но все это кажется очень сложным.Это очень похоже на то, как bash-скрипты получают доступ к значениям аргументов, и это уже предусмотрено стандартом для node.js, как указал MooGoo.(Просто чтобы было понятно кому-то новичку в node.js)

Пример:

$ node yourscript.js banana monkey

var program_name = process.argv[0]; //value will be "node"
var script_path = process.argv[1]; //value will be "yourscript.js"
var first_value = process.argv[2]; //value will be "banana"
var second_value = process.argv[3]; //value will be "monkey"
73 голосов
/ 20 сентября 2011

Commander.js

Отлично работает для определения ваших опций, действий и аргументов.Он также генерирует страницы справки для вас.

Оперативно

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

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

42 голосов
/ 13 августа 2013

Библиотека Stdio

Самым простым способом анализа аргументов командной строки в NodeJS является использование модуля stdio . Вдохновленный утилитой UNIX getopt, он так же тривиален:

var stdio = require('stdio');
var ops = stdio.getopt({
    'check': {key: 'c', args: 2, description: 'What this option means'},
    'map': {key: 'm', description: 'Another description'},
    'kaka': {args: 1, mandatory: true},
    'ooo': {key: 'o'}
});

Если вы запустили предыдущий код с этой командой:

node <your_script.js> -c 23 45 --map -k 23 file1 file2

Тогда ops объект будет выглядеть следующим образом:

{ check: [ '23', '45' ],
  args: [ 'file1', 'file2' ],
  map: true,
  kaka: '23' }

Так что вы можете использовать его как хотите. Например:

if (ops.kaka && ops.check) {
    console.log(ops.kaka + ops.check[0]);
}

Сгруппированные параметры также поддерживаются, поэтому вы можете написать -om вместо -o -m.

Кроме того, stdio может автоматически генерировать вывод справки / использования. Если вы позвоните ops.printHelp(), вы получите следующее:

USAGE: node something.js [--check <ARG1> <ARG2>] [--kaka] [--ooo] [--map]
  -c, --check <ARG1> <ARG2>   What this option means (mandatory)
  -k, --kaka                  (mandatory)
  --map                       Another description
  -o, --ooo

Предыдущее сообщение отображается также в том случае, если не указана обязательная опция (с предшествующим сообщением об ошибке) или если она указана неправильно (например, если для опции указана одна аргумент arg и для нее требуется 2).

Вы можете установить stdio , используя NPM :

npm install stdio
40 голосов
/ 17 июня 2013

Если ваш сценарий называется myScript.js и вы хотите передать имя и фамилию «Шон Уортингтон» в качестве аргументов, подобных приведенным ниже:

node myScript.js Sean Worthington

Затем в вашем сценарии вы пишете:

var firstName = process.argv[2]; // Will be set to 'Sean'
var lastName = process.argv[3]; // Will be set to 'Worthington'
27 голосов
/ 08 января 2019

Нет библиотек с флагами, отформатированными в простой объект

function getArgs () {
const args = {};
process.argv
    .slice(2, process.argv.length)
    .forEach( arg => {
    // long arg
    if (arg.slice(0,2) === '--') {
        const longArg = arg.split('=');
        const longArgFlag = longArg[0].slice(2,longArg[0].length);
        const longArgValue = longArg.length > 1 ? longArg[1] : true;
        args[longArgFlag] = longArgValue;
    }
    // flags
    else if (arg[0] === '-') {
        const flags = arg.slice(1,arg.length).split('');
        flags.forEach(flag => {
        args[flag] = true;
        });
    }
    });
return args;
}
const args = getArgs();
console.log(args);

Примеры

Простой

input

node test.js -D --name=Hello

output

{ D: true, name: 'Hello' }

Реальный мир

вход

node config/build.js -lHRs --ip=$HOST --port=$PORT --env=dev

выход

{ 
  l: true,
  H: true,
  R: true,
  s: true,
  ip: '127.0.0.1',
  port: '8080',
  env: 'dev'
}
...