Питання Як передавати аргументи командного рядка в програму Node.js?


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

$ node server.js folder

тут server.js це мій серверний код. Node.js допоможе, що це можливо:

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

Як отримати доступ до цих аргументів у JavaScript? Як-небудь я не зміг знайти цю інформацію в Інтернеті.


1774
2017-12-04 01:56


походження




Відповіді:


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

Аргументи зберігаються в 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

2356
2017-12-04 02:05



так. Дякую. console.log (process.argv [2]); друкує мою папку - milkplus
Що потрібно ввести в командний рядок, щоб запустити скрипт node.js з аргументами командного рядка? - Anderson Green
UPDATE: Я знайшов відповідь на це питання вище. stackoverflow.com/questions/12925802/... - Anderson Green
Мінімум це відмінний і простий аналізатор аргументів - Guilherme Nagatomo
Ви також можете отримати доступ до одного аргументу, коли ви знаєте його позицію: process.argv[n] де n це нульовий індекс - Luca Steeb


Щоб нормалізувати такі аргументи, як регулярна функція JavaScript, я роблю це в моїх скриптах shell.js:

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

Зверніть увагу, що спочатку аргумент - це шлях до nodejs, а другий аргумент - це місце сценарію, який ви виконуєте.


479
2018-04-23 23:13



Дякую Джейсем. Хотів би побачити, де це написано в майбутньому специфікації. Це би зламало так багато бібліотек js ... - Mauvis Ledford
Ця відповідь мені корисніше, ніж перша, яка пряма з документів NodeJS. Принаймні це допомогло мені виконати те, що я шукав. - JohnAllen
Просто зауважте, що я написав цю відповідь 4 роки тому, і код, який я працюю, все ще працює на 100% добре сьогодні. Продовжуючи в курсі останніх версій вузла і все ще нульових проблем: це просто прості скрипти обох хлопців. Не входить у великий глобальний об'єкт, повний бібліотек JS. Я досі стою за моєю відповіддю сьогодні. Я дам ще одне оновлення ще через 4 роки. - Mauvis Ledford
var args = process.argv.splice(process.execArgv.length + 2); // оскільки існують винятки з використання команд вузла, наприклад: node --harmony script.js balala. побачити process.execArgv - cuixiping
@ Куісіпіп, але execArgv є ні в argv так що 2 достатньо - Tommi Kyntola


Останній правильно Відповідь для цього це використовувати мінімум бібліотека Ми використовували вузол-оптиміст але з тих пір вона застаріла.

Ось приклад того, як його використовувати, взято прямо з документації minimis:

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' }

238
2017-07-08 17:26



Власне, це рішення є більш корисним для розробки інструменту командного рядка з більшою кількістю прапорів та аргументів, і має бути виправлено більше IMHO. - JK ABC
Імо, це більш проста альтернатива npmjs.com/package/command-line-args - klodoma
@JKABC Я не називаю це найбільш правильною відповіддю, оскільки OP просто просить отримати доступ до тривіальної інформації командного рядка. Але я погоджуюсь, що і minimis, і командні рядки дуже корисні, якщо ви плануєте розширити свій CLI. - Justus Romijn
Цікаво, чому "-n5" не виробляє "n5: true" - це буде сенс для мене. - Max Waterman
@MaxWaterman: оскільки варіанти, які починаються з одного тире, мають бути лише одним символом. Все, що слідує за єдиним символом, приймається як аргумент для параметра (без пробілу). Запуск варіанту з двома деформаціями (наприклад, --n5) повинен вивести "n5: true". Це досить стандартна поведінка для більшості інструментів командного рядка Unix (але не на жаль). - Menno Smits


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: Зрілі / інтерактивні програми командного рядка з розбором аргументів.


204
2018-01-14 05:26



Ярги дуже хороший - ForzaGreen
"$ npm install-g yargs" дало 1,9 Мб коду JavaScript. Коли цей божевілля закінчиться, коли бібліотеці аналізатора argv потрібні два мегабайти коду? Збільшена поверхня атаки, витрачена пам'ять тощо ... - joonas.fi
Yargs є більшим інструментом, який також трапляється для аналізу аргументів командного рядка. Без божевілля, просто відсутність інформації. Якщо ви хочете щось легше, скористайтеся сировиною JS, Mow або Minimist. - dthree
nconf відсутній - Michael
"$ npm i yargs" -> 800 Кб тут, я думаю, власники пакетів, нарешті, навчилися ігнорувати невідповідні файли. У будь-якому випадку, все ще великий для дурних проектів, але малий, коли вам потрібна надійність, а на великих проектах у вас вже є залежності .. - Andre Figueiredo


Оптиміст (вузол-оптиміст)

Перевірити Оптимістична бібліотека, це набагато краще, ніж аналіз параметрів командного рядка вручну.

Оновити

Оптиміст застарілий. Спробуй yargs який є активною вилкою оптиміста.


108
2017-07-04 04:02



+1 для посилання. Дуже довгий список параметрів параметрів командного рядка в github.com/joyent/node/wiki/modules#wiki-parsers-commandline - Thilo
Це застаріло. Ярги є розвитком оптимістів. github.com/chevex/yargs - Nikolay Yordanov
Мінімум є ще одним спадкоємцем нині незаслуженого оптиміста. Це "сміття синтаксичного аналізатора оптиміста без усякого прикраси". 23 мільйони завантажень за останній місяць (станом на 12/2015). - aap


Тут є кілька чудових відповідей, але все це здається дуже складним. Це дуже схоже на те, як башові скрипти отримують доступ до значень аргументів, і це вже передбачено стандартом з 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"

69
2017-12-12 05:19





Commander.js

Працює чудово для визначення ваших параметрів, дій та аргументів. Він також генерує довідкові сторінки для вас.

Негайно

Працює чудово для отримання входу від користувача, якщо вам подобається підхід зворотного виклику.

Супровід

Працює чудово для отримання входу від користувача, якщо вам подобається підхід генератора.


66
2017-09-20 10:20



@ Еван Керролл, будь ласка, не редагуйте мою відповідь на рекламу бібліотеки, яку я не використовую stackoverflow.com/posts/7483600/revisions особливо з огляду на відсутність функції, яку ви наслідували, такі думки слід зберігати для коментарів або витягувати запити авторам модулів, а не редагувати чужі відповіді. - balupton
Commander.js дійсно допомогло мені. Інші бібліотеки не будуть працювати з компілятором nexe, але це робить трюк. Якщо ви хочете отримувати аргументи при використанні nexe, обов'язково передайте -f до компілятора nexe. - pierce.jason
Commander.js Extreamelly просто !!! - aemonge


Бібліотека 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

Попереднє повідомлення також відображається, якщо обов'язковий параметр не задано (передує повідомлення про помилку) або якщо він неправильно вказаний (наприклад, якщо ви вказали один аргумент для опції, і йому потрібно 2).

Ви можете встановити stdio використовуючи модуль NPM:

npm install stdio

36
2017-08-13 10:30



Згідно з TOS SO, варто відзначити, що @sgmonda є єдиним підтримувачем модуля;) Хороший маленький модуль, однак. Безумовно корисний. - Qix
Насправді корисно, хоча останнє оновлення було 30 грудня 2014 року. Може не так добре підтримуватися як деякі інші пакунки. - fearless_fool
приємно либ! ткс! хоча це і є останні новини .. Він має достатньо хорошу функціональність - Pablo Ezequiel


Якщо ваш скрипт називається myScript.js, і ви хочете вказати ім'я та прізвище, "Sean Worthington", як аргументи, наведені нижче:

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'

30
2018-06-17 00:04





Командний рядок-args варто подивитися!

Ви можете встановити параметри, використовуючи основні стандарти позначення (вивчайте більше) Ці команди є еквівалентними, встановлюючи однакові значення:

$ example --verbose --timeout=1000 --src one.js --src two.js
$ example --verbose --timeout 1000 --src one.js two.js
$ example -vt 1000 --src one.js two.js
$ example -vt 1000 one.js two.js

Щоб отримати доступ до значень, спершу створіть список Опції визначення описуючи параметри, які ваша заявка приймає. The type властивість є функцією setter (надане значення проходить через це), що дає вам повний контроль над отриманим значенням.

const optionDefinitions = [
  { name: 'verbose', alias: 'v', type: Boolean },
  { name: 'src', type: String, multiple: true, defaultOption: true },
  { name: 'timeout', alias: 't', type: Number }
]

Далі розібрати параметри за допомогою commandLineArgs ():

const commandLineArgs = require('command-line-args')
const options = commandLineArgs(optionDefinitions)

options зараз виглядає так:

{
  src: [
    'one.js',
    'two.js'
  ],
  verbose: true,
  timeout: 1000
}

Розширене використання

Крім вищезазначеного типового використання, ви можете налаштувати параметри командного рядка для отримання більш просунутих форм синтаксису.

Синтаксис на основі команд (стиль git) у формі:

$ executable <command> [options]

Наприклад.

$ git commit --squash -m "This is my commit message"

Синтаксис командного і підкоманд (стиль докерів) у формі:

$ executable <command> [options] <sub-command> [options]

Наприклад.

$ docker run --detached --image centos bash -c yum install -y httpd

Створення довідника використання

Довідник щодо використання (як правило, друкується, коли --help встановлений) може бути сформований за допомогою командний рядок-використання. Див нижче приклади та прочитайте документацію для інструкцій щодо їх створення.

Типовий приклад використання керівництва.

usage

The полімер-клі Посібник із використання є хорошим прикладом реального життя.

usage

Подальше читання

Є ще багато чого, щоб дізнатись, будь ласка, дивіться вікі для прикладів та документації.


20
2017-11-15 16:00



@Lloyd це пов'язано з проблемою вже піднялася - тут. Webstorm передає кілька додаткових аргументів. - kboom
@kboom ця проблема була вирішена partial і stopAtFirstUnknown варіанти Побачити документи. - Lloyd


Для цього є додаток. Ну, модуль. Ну, більше одного, напевно, сотні.

Ярги це один з найцікавіших, його документи прохолодно читати.

Ось приклад з сторінки github / npm:

#!/usr/bin/env node
var argv = require('yargs').argv;
console.log('(%d,%d)', argv.x, argv.y);
console.log(argv._);

Вихід тут (це читає варіанти з дефісами тощо, короткі та довгі, числові тощо).

$ ./nonopt.js -x 6.82 -y 3.35 rum
(6.82,3.35)
[ 'rum' ] 
$ ./nonopt.js "me hearties" -x 0.54 yo -y 1.12 ho
(0.54,1.12)
[ 'me hearties', 'yo', 'ho' ]

17
2018-03-14 00:45