Pytanie Jak przekazać argumenty wiersza poleceń do programu Node.js?


Mam napisany serwer WWW Node.js i chciałbym uruchomić z określonym folderem. Nie wiem, jak uzyskać dostęp do argumentów w JavaScript. Węzeł uruchomiony tak:

$ node server.js folder

tutaj server.js to mój kod serwera. Pomoc Node.js mówi, że jest to możliwe:

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

Jak uzyskać dostęp do tych argumentów w JavaScript? Jakoś nie mogłem znaleźć tych informacji w Internecie.


1775
2017-12-04 01:56


pochodzenie




Odpowiedzi:


Metoda standardowa (bez biblioteki)

Argumenty są przechowywane w process.argv

Tu są dokumentacja węzła na temat obsługi argumentów wiersza poleceń:

process.argv jest tablicą zawierającą argumenty wiersza poleceń. Pierwszym elementem będzie "węzeł", drugim elementem będzie nazwa pliku JavaScript. Kolejnymi elementami będą wszelkie dodatkowe argumenty wiersza poleceń.

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

Spowoduje to wygenerowanie:

$ 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



tak. dzięki. console.log (process.argv [2]); drukuje mój folder - milkplus
Co należy wpisać w wierszu polecenia, aby uruchomić skrypt node.js z argumentami wiersza polecenia? - Anderson Green
AKTUALIZACJA: Znalazłem odpowiedź na powyższe pytanie. stackoverflow.com/questions/12925802/... - Anderson Green
Minimist to świetny i prosty analizator argumentów - Guilherme Nagatomo
Możesz także uzyskać dostęp do pojedynczego argumentu, gdy znasz jego położenie: process.argv[n] gdzie n jest indeksem bazującym na zera - Luca Steeb


Aby znormalizować argumenty, takie jak zwykła funkcja javascript, otrzymam, robię to w skryptach powłoki node.js:

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

Zauważ, że pierwszy argument jest zwykle ścieżką do nodejs, a drugi argument jest lokalizacją skryptu, który wykonujesz.


479
2018-04-23 23:13



Dzięki Jaseem. Chciałbym zobaczyć, gdzie to jest napisane w przyszłej specyfikacji. Przełamałoby to tak wiele bibliotek js ... - Mauvis Ledford
Ta odpowiedź jest dla mnie bardziej przydatna niż pierwsza, bezpośrednio z dokumentacji NodeJS. Przynajmniej pomogło mi to osiągnąć to, czego szukałem. - JohnAllen
Tylko uwaga, że ​​napisałem tę odpowiedź 4 lata temu, a kod, który prowadzę, nadal działa poprawnie w 100%. Ciągle na bieżąco z najnowszymi wersjami węzła i wciąż zero problemów: To tylko zwykli faceci z powłoki. Nie jest częścią dużego globalnego obiektu pełnego bibliotek JS. Wciąż stoję za moją odpowiedzią dzisiaj. Dam kolejną aktualizację za 4 lata. - Mauvis Ledford
var args = process.argv.splice(process.execArgv.length + 2); // ponieważ istnieją wyjątki użycia komend węzła, na przykład: node --harmony script.js balala. widzieć process.execArgv - cuixiping
@cuixiping ale execArgv są nie w argv więc 2 wystarczy - Tommi Kyntola


Aktualne dobrze odpowiedź na to, aby korzystać z minimist biblioteka. Kiedyś używaliśmy Optymista węzła ale od tego czasu został przestarzały.

Oto przykład użycia go prosto z dokumentacji minimisty:

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

239
2017-07-08 17:26



W rzeczywistości to rozwiązanie jest bardziej pomocne w tworzeniu narzędzia wiersza poleceń z większą liczbą flag i argumentów i powinno zostać wznowione więcej IMHO. - JK ABC
Imo, to jest prostsza alternatywa dla npmjs.com/package/command-line-args - klodoma
@JKABC Nie nazwałbym tego najbardziej poprawną odpowiedzią, ponieważ OP tylko prosi o dostęp do banalnych informacji z linii poleceń. Zgadzam się jednak, że argumenty minimistyczne i wiersza polecenia są bardzo przydatne, jeśli planujesz rozszerzyć swój interfejs CLI. - Justus Romijn
Zastanawiam się, dlaczego "-n5" nie produkuje "n5: true" - to miałoby dla mnie sens. - Max Waterman
@MaxWaterman: ponieważ opcje zaczynające się od pojedynczego myślnika mają tylko jeden znak. Wszystko, co następuje po pojedynczej opcji jest traktowane jako argument dla opcji (brak miejsca). Uruchomienie opcji za pomocą dwóch kresek (np. - n5) powinno spowodować "n5: true". Jest to dość standardowe zachowanie dla większości narzędzi wiersza poleceń systemu Unix (ale nie wszystkie niestety). - Menno Smits


2018 odpowiedzi na podstawie aktualnych trendów w środowisku naturalnym:


Przetwarzanie argumentu javascript Vanilla:

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

To zwraca:

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

Oficjalne dokumenty


Najczęściej używane pakiety NPM do parsowania argumentów:

Minimist: Do minimalnego parsowania argumentów.

Commander.js: Najbardziej przyjęty moduł do analizy argumentów.

Miauczeć: Lżejsza alternatywa dla Commander.js

Yargs: Bardziej zaawansowane przetwarzanie argumentów (ciężkie).

Vorpal.js: Dojrzałe / interaktywne aplikacje wiersza poleceń z analizą argumentów.


204
2018-01-14 05:26



Yargs jest bardzo dobry - ForzaGreen
"$ npm install -g yargs" dało 1,9 MB kodu JavaScript. Kiedy to szaleństwo dobiegnie końca, gdy biblioteka parsera argv potrzebuje dwóch megabajtów kodu? Zwiększona powierzchnia ataku, zmarnowana pamięć RAM itp ... - joonas.fi
Yargs to większe narzędzie, które również analizuje argumenty wiersza poleceń. Bez szaleństwa, po prostu brak informacji. Jeśli chcesz czegoś lżejszego, użyj surowego JS, Meow lub Minimist. - dthree
nconf brakuje - Michael
"$ npm i yargs" -> 800 KB tutaj, domyślam się, że właściciele pakietów w końcu nauczyli się ignorować nietrafne pliki. W każdym razie, wciąż duże na głupie projekty, ale niewielkie, gdy potrzebujesz solidności i na większych projektach masz już zależności. - Andre Figueiredo


Optymista (optymista węzła)

Sprawdzić biblioteka optymistyczna, jest o wiele lepszy niż ręczne analizowanie opcji wiersza poleceń.

Aktualizacja

Optymista jest przestarzały. Próbować yargs który jest aktywnym widelcem optymisty.


108
2017-07-04 04:02



+1 dla linku. Istnieje dość długa lista parserów opcji wiersza poleceń github.com/joyent/node/wiki/modules#wiki-parsers-commandline - Thilo
To jest przestarzałe. Yargs jest widelcem optymisty. github.com/chevex/yargs - Nikolay Yordanov
Minimist jest kolejnym następcą obecnie przestarzałego optymisty. To "odwaga paralizatora argumentów optymisty bez całej fantazyjnej dekoracji". 23 miliony pobrań w ostatnim miesiącu (stan na 12/2015). - aap


Kilka świetnych odpowiedzi tutaj, ale wszystko wydaje się bardzo skomplikowane. Jest to bardzo podobne do tego, w jaki sposób skrypty bash uzyskują dostęp do wartości argumentów i jest już dostarczany standard z node.js, jak wskazał MooGoo. (Tylko po to, aby było zrozumiałe dla kogoś, kto jest nowy dla node.js)

Przykład:

$ 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

Działa doskonale do definiowania opcji, akcji i argumentów. Generuje również strony pomocy dla ciebie.

Natychmiast

Działa świetnie w celu uzyskania danych wejściowych od użytkownika, jeśli podoba Ci się podejście do oddzwaniania.

Co-Prompt

Działa świetnie na uzyskanie danych wejściowych od użytkownika, jeśli podoba Ci się podejście generatora.


66
2017-09-20 10:20



@Evan Carroll, nie edytuj mojej odpowiedzi, aby promować bibliotekę, której nie używam stackoverflow.com/posts/7483600/revisions szczególnie z powodu brakującej funkcji, którą chcesz śledzić, opinie takie powinny być zapisywane do komentarzy lub prośby do autorów modułów, a nie do odpowiedzi innych ludzi. - balupton
Commander.js naprawdę mi pomógł. Inne biblioteki nie działałyby z kompilatorem nexe, ale to działa. Jeśli chcesz uzyskać argumenty podczas używania nexe, należy przekazać -f do kompilatora nexe. - pierce.jason
Commander.js Extreamelly easy !!! - aemonge


Biblioteka Stdio

Najłatwiejszym sposobem analizowania argumentów wiersza poleceń w węźle NodeJS jest użycie stdio moduł. Zainspirowany przez UNIX getopt narzędzie, jest tak banalne, jak następuje:

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

Jeśli uruchomisz poprzedni kod za pomocą tego polecenia:

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

Następnie ops Obiekt będzie wyglądał następująco:

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

Możesz więc użyć go tak, jak chcesz. Na przykład:

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

Pogrupowane opcje są również obsługiwane, dzięki czemu można pisać -om zamiast -o -m.

Ponadto, stdio może automatycznie wygenerować wynik pomocy / użycia. Jeśli zadzwonisz ops.printHelp() otrzymasz następujące informacje:

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

Poprzedni komunikat jest wyświetlany również wtedy, gdy nie podano obowiązkowej opcji (poprzedzona komunikatem o błędzie) lub jest ona błędnie określona (na przykład, jeśli podasz pojedynczy argument dla opcji i będzie on wymagał 2).

Możesz zainstalować stdio moduł za pomocą NPM:

npm install stdio

36
2017-08-13 10:30



Jak na TOS TOS, warto wspomnieć, że @sgmonda jest jedynym opiekunem modułu;) Ale fajny mały moduł. Zdecydowanie przydatny. - Qix
Rzeczywiście użyteczne, chociaż najnowsza aktualizacja miała miejsce 30 grudnia 2014 r. Może nie być tak dobrze utrzymana, jak niektóre inne pakiety. - fearless_fool
dobra lib! tks! mimo to jest to nieaktualne aktualizacje. Ma wystarczająco dobrą funkcjonalność - Pablo Ezequiel