Wie übergebe ich Befehlszeilenargumente an ein Node.js-Programm?


2416

Ich habe einen Webserver in Node.js geschrieben und möchte mit einem bestimmten Ordner starten. Ich bin nicht sicher, wie ich auf Argumente in JavaScript zugreifen soll. Ich führe einen Knoten wie folgt aus:

$ node server.js folder

Hier server.jsist mein Servercode. Die Hilfe von Node.j sagt, dass dies möglich ist:

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

Wie würde ich in JavaScript auf diese Argumente zugreifen? Irgendwie konnte ich diese Informationen nicht im Web finden.

Antworten:


3047

Standardmethode (keine Bibliothek)

Die Argumente werden in gespeichert process.argv

Hier sind die Knotendokumente zur Behandlung von Befehlszeilenargumenten:

process.argvist ein Array, das die Befehlszeilenargumente enthält. Das erste Element ist 'node', das zweite Element ist der Name der JavaScript-Datei. Die nächsten Elemente sind zusätzliche Befehlszeilenargumente.

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

Dies erzeugt:

$ 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

7
Was muss ich in die Eingabeaufforderung eingeben, um ein node.js-Skript mit Befehlszeilenargumenten auszuführen?
Anderson Green

8
UPDATE: Ich habe die Antwort auf die obige Frage gefunden. stackoverflow.com/questions/12925802/…
Anderson Green

2
Minimist ist ein großartiger und einfacher Argument-Parser
Guilherme Nagatomo

4
Sie können auch auf ein einzelnes Argument zugreifen, wenn Sie dessen Position kennen: process.argv[n]Wo nist der auf Null basierende Index
Luca Steeb

6
Das 2. Element (process.argv [1]) kann eine js-Datei sein oder nicht. Die Syntax des Knotenbefehls lautet node [options] [ -e script | script.js ] [arguments]oder node debug script.js [arguments]. Zum Beispiel: node --harmony script.js balalaoder node --no-deprecation --enable-ssl2 script.js balalawir können process.execArgv mit process.argv verwenden
cuixiping

678

Um die Argumente zu normalisieren, die eine reguläre Javascript-Funktion erhalten würde, mache ich dies in meinen Shell-Skripten node.js:

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

Beachten Sie, dass das erste Argument normalerweise der Pfad zu nodejs ist und das zweite Argument der Speicherort des Skripts ist, das Sie ausführen.


19
Nur eine Anmerkung, dass ich diese Antwort vor 4 Jahren geschrieben habe und der Code, den ich ausführe, heute noch zu 100% in Ordnung ist. Immer auf dem neuesten Stand mit den neuesten Versionen von Node und immer noch ohne Probleme: Es ist nur ein einfaches Shell-Skript. Nicht Teil eines großen globalen Objekts voller JS-Bibliotheken. Ich stehe heute noch hinter meiner Antwort. Ich werde in 4 weiteren Jahren ein weiteres Update geben.
Mauvis Ledford

55
var args = process.argv.splice(process.execArgv.length + 2);// weil es Ausnahmen bei der Verwendung von Knotenbefehlen gibt, zum Beispiel : node --harmony script.js balala. siehe process.execArgv
cuixiping

36
@ Cuixiping, aber die execArgvsind nicht in argvso die 2 ist genug
Tommi Kyntola

7
Nachdem ich mir den Bearbeitungsverlauf dieser Antwort angesehen habe, möchte ich mir einen Moment Zeit nehmen, um mit @MauvisLedford zu sympathisieren. Nichts ist so ärgerlich wie unerwünschte Änderungen an Ihrem Code im Namen Ihrer persönlichen Präferenz (ohne quantifizierbare Vorteile, um zu booten). Wem das das antut: wegwerfen.
Jonathan Dumaine

12
DO NOTprocess.argv.splice(process.execArgv.length + 2) : für einen Befehl node --harmony script.js --version, das process.argvist ['/usr/local/bin/node', 'script.js', '--version']. Flaggen an nodesind NICHT enthalten process.argv!
30онстантин Ван

360

Die aktuell richtige Antwort darauf ist die Verwendung der Minimist- Bibliothek. Früher haben wir Node-Optimist verwendet, aber seitdem ist es veraltet.

Hier ist ein Beispiel für die Verwendung direkt aus der Minimist-Dokumentation:

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

32
Tatsächlich ist diese Lösung hilfreicher für die Entwicklung eines Befehlszeilentools mit mehr Flags und Argumenten und sollte meiner Meinung nach mehr positiv bewertet werden.
JK ABC

2
Imo, dies ist eine einfachere Alternative zu npmjs.com/package/command-line-args
klodoma

5
@JKABC Ich würde dies nicht als die richtigste Antwort bezeichnen, da das OP nur nach dem Zugriff auf triviale Befehlszeileninformationen fragt. Ich stimme jedoch zu, dass sowohl Minimist- als auch Befehlszeilenargumente sehr nützlich sind, wenn Sie planen, Ihre CLI zu erweitern.
Justus Romijn

2
Ich frage mich, warum das '-n5' nicht 'n5: true' erzeugt - das würde für mich Sinn machen.
Max Waterman

7
@ MaxWaterman: weil Optionen, die mit einem einzelnen Bindestrich beginnen, nur ein einzelnes Zeichen enthalten sollen. Alles, was auf eine einzelne char-Option folgt, wird als Argument für die Option verwendet (kein Platz erforderlich). Das Starten der Option mit zwei Bindestrichen (dh --n5) sollte 'n5: true' ergeben. Dies ist ein ziemlich normales Verhalten für die meisten Unix-Befehlszeilentools (aber leider nicht für alle).
Menno Smits

313

Antwort 2018 basierend auf aktuellen Trends in freier Wildbahn:


Analyse von Vanille-Javascript-Argumenten:

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

Dies gibt zurück:

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

Offizielle Dokumente


Die am häufigsten verwendeten NPM-Pakete zum Parsen von Argumenten:

Minimist : Für minimales Parsen von Argumenten.

Commander.js : Das am häufigsten verwendete Modul für das Parsen von Argumenten.

Miau : Leichtere Alternative zu Commander.js

Yargs : Anspruchsvollere Argumentanalyse (schwer).

Vorpal.js : Reife / interaktive Befehlszeilenanwendungen mit Argumentanalyse.


76
"$ npm install -g yargs" ergab 1,9 MB JavaScript-Code. Wann endet dieser Wahnsinn, wenn eine Argv-Parser-Bibliothek zwei Megabyte Code benötigt? Erhöhte Angriffsfläche, verschwendeter RAM usw.
joonas.fi

9
Yargs ist ein größeres Tool, das auch Befehlszeilenargumente analysiert. Kein Wahnsinn, nur Mangel an Informationen. Wenn Sie etwas Leichteres wollen, verwenden Sie das rohe JS, Meow oder Minimist.
Drei

1
"$ npm i yargs" -> 800 KB hier, ich denke, Paketbesitzer haben endlich gelernt, irrelevante Dateien zu ignorieren. Wie auch immer, immer noch groß für dumme Projekte, aber klein, wenn Sie Robustheit brauchen und bei größeren Projekten haben Sie bereits Abhängigkeiten.
Andre Figueiredo

3
Ich habe ein Paket namens wily-cli erstellt , mit dem Ziel, ein leistungsfähigeres, anpassbareres und benutzerfreundlicheres Tool als die aufgeführten großen Namen zu entwickeln. Für diejenigen unter Ihnen, die interessiert sind, sind es nur 94,6 KB bei der Installation
Jason

1
vscode import-cost sagt mir, dass Yargs (159,2 KB) jetzt tatsächlich leichter sind als Miau (180,2 KB). Minimist schlägt sie immer noch bei 3.4K!
Shivam Tripathi

124

Optimist (Knotenoptimist)

Schauen Sie sich die Optimist-Bibliothek an , sie ist viel besser als das manuelle Parsen von Befehlszeilenoptionen.

Aktualisieren

Optimist ist veraltet. Versuchen Yargs , eine aktive Gabel des Optimisten.


18
+1 für den Link. Es gibt eine ziemlich lange Liste von Parsern für Befehlszeilenoptionen unter github.com/joyent/node/wiki/modules#wiki-parsers-commandline
Thilo

7
Minimist ist ein weiterer Nachfolger des inzwischen veralteten Optimisten. Es ist "der Mut des Argumentationsparsers des Optimisten ohne all die phantasievolle Dekoration." 23 Millionen Downloads im letzten Monat (Stand 12/2015).
aap

96

Einige gute Antworten hier, aber alles scheint sehr komplex. Dies ist sehr ähnlich dem Zugriff von Bash-Skripten auf Argumentwerte und wird bereits standardmäßig mit node.js bereitgestellt, wie MooGoo hervorhob. (Nur um es für jemanden verständlich zu machen, der neu in node.js ist)

Beispiel:

$ 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"

80

Commander.js

Funktioniert hervorragend zum Definieren Ihrer Optionen, Aktionen und Argumente. Außerdem werden die Hilfeseiten für Sie generiert.

Sofort

Funktioniert hervorragend, um Eingaben vom Benutzer zu erhalten, wenn Sie den Rückrufansatz mögen.

Co-Prompt

Funktioniert hervorragend, um Eingaben vom Benutzer zu erhalten, wenn Sie den Generatoransatz mögen.


26
@Evan Carroll Bitte bearbeiten Sie meine Antwort nicht, um eine Bibliothek zu bewerben. Ich verwende stackoverflow.com/posts/7483600/revisions nicht, insbesondere wegen einer fehlenden Funktion, nach der Sie suchen. Solche Meinungen sollten für Kommentare oder Pull-Anfragen gespeichert werden Die Modulautoren bearbeiten nicht die Antworten anderer Personen.
Balupton

Commander.js hat mir wirklich geholfen. Andere Bibliotheken würden mit dem Nexe-Compiler nicht funktionieren, aber dieser macht den Trick. Wenn Sie bei der Verwendung von nexe Argumente erhalten möchten, übergeben Sie -f unbedingt an den nexe-Compiler.
pierce.jason

60

Keine Bibliotheken mit Flags, die in ein einfaches Objekt formatiert sind

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

Beispiele

Einfach

Eingang

node test.js -D --name=Hello

Ausgabe

{ D: true, name: 'Hello' }

Echte Welt

Eingang

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

Ausgabe

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

1
Da einige Flags eine lange Form haben, können Sie dies berücksichtigen. Anstatt dass = longArg[1]Sie schreiben könnten = longArg.length > 1 ? longArg[1] : true;Dies würde Sie diese Art von Argument passieren lassen:node config/build.js --flag1 --flag2
Tralston

Ich mag das. Es hat die Leitung etwas lang gemacht, also habe ich sie aufgelöst. Danke, dass du mir davon erzählt hast.
Michael Warner

54

Stdio Bibliothek

Der einfachste Weg, Befehlszeilenargumente in NodeJS zu analysieren, ist die Verwendung des stdio- Moduls. Inspiriert vom UNIX- getoptDienstprogramm ist es so trivial wie folgt:

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, required: true},
    'ooo': {key: 'o'}
});

Wenn Sie den vorherigen Code mit diesem Befehl ausführen:

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

Dann wird das opsObjekt wie folgt sein:

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

So können Sie es verwenden, wie Sie möchten. Zum Beispiel:

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

Gruppierte Optionen werden ebenfalls unterstützt, sodass Sie -omstatt schreiben können -o -m.

Darüber hinaus stdiokann automatisch eine Hilfe- / Nutzungsausgabe generiert werden. Wenn Sie anrufen, erhalten ops.printHelp()Sie Folgendes:

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

Die vorherige Meldung wird auch angezeigt, wenn keine obligatorische Option angegeben ist (vorangestellt von der Fehlermeldung) oder wenn sie falsch angegeben ist (z. B. wenn Sie ein einzelnes Argument für eine Option angeben und diese 2 benötigt).

Sie können installieren stdio- Modul mit NPM :

npm install stdio

3
Gemäß den Nutzungsbedingungen von SO ist es erwähnenswert, dass @sgmonda der einzige Betreuer des Moduls ist;) Nettes kleines Modul. Auf jeden Fall nützlich.
Qix - MONICA wurde am

1
In der Tat nützlich, obwohl das letzte Update der 30. Dezember 2014 war. Möglicherweise nicht so gut gewartet wie einige andere Pakete.
fearless_fool

schöne lib! tks! Obwohl es ohne aktuelle Updates ist .. Es hat genug gute Funktionalität
Pablo Ezequiel

Es ist eine Weile her, aber ich habe gerade Version 2 veröffentlicht, mit vollem Versprechen und Unterstützung für Typoskripte. :-)
sgmonda

47

Wenn Ihr Skript myScript.js heißt und Sie den Vor- und Nachnamen 'Sean Worthington' als Argumente wie folgt übergeben möchten:

node myScript.js Sean Worthington

Dann schreiben Sie in Ihr Skript:

var firstName = process.argv[2]; // Will be set to 'Sean'
var lastName = process.argv[3]; // Will be set to 'Worthington'

28

Kommandozeilen-Argumente sind einen Blick wert!

Sie können Optionen mithilfe der Hauptnotationsstandards festlegen ( weitere Informationen ). Diese Befehle sind alle gleichwertig und setzen dieselben Werte:

$ 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

Um auf die Werte zuzugreifen, erstellen Sie zunächst eine Liste mit Optionsdefinitionen, in denen die von Ihrer Anwendung akzeptierten Optionen beschrieben werden. Die typeEigenschaft ist eine Setter-Funktion (der angegebene Wert wird hierdurch übergeben), sodass Sie die volle Kontrolle über den empfangenen Wert haben.

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

Analysieren Sie als Nächstes die Optionen mit commandLineArgs () :

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

options sieht jetzt so aus:

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

Erweiterte Verwendung

Neben der oben genannten typischen Verwendung können Sie Befehlszeilenargumente so konfigurieren, dass sie erweiterte Syntaxformulare akzeptieren.

Befehlsbasierte Syntax (Git-Stil) in der Form:

$ executable <command> [options]

Zum Beispiel.

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

Befehls- und Unterbefehlssyntax (Docker-Stil) in der Form:

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

Zum Beispiel.

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

Generierung von Nutzungsrichtlinien

Ein Verwendungsleitfaden (normalerweise gedruckt, wenn er festgelegt --helpist) kann mithilfe der Befehlszeilennutzung erstellt werden . Sehen Sie sich die folgenden Beispiele an und lesen Sie die DokumentationAnweisungen zum Erstellen finden Sie in .

Ein typisches Beispiel für eine Bedienungsanleitung.

Verwendungszweck

Die Gebrauchsanweisung für Polymer-Cli ist ein gutes Beispiel aus der Praxis .

Verwendungszweck

Weiterführende Literatur

Es gibt noch viel mehr zu lernen. Beispiele und Dokumentation finden Sie im Wiki .


@Lloyd das hängt mit dem bereits gestiegenen Problem zusammen - hier . Webstorm übergibt einige zusätzliche Argumente.
Kboom

@kboom Dieses Problem wurde durch die Optionen partialund behoben stopAtFirstUnknown. Siehe die Dokumente .
Lloyd

23

Dafür gibt es eine App. Nun, Modul. Nun, mehr als eine, wahrscheinlich Hunderte.

Yargs ist einer der lustigen, seine Dokumente sind cool zu lesen.

Hier ist ein Beispiel von der Seite github / npm:

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

Die Ausgabe erfolgt hier (sie liest Optionen mit Bindestrichen usw., kurz und lang, numerisch usw.).

$ ./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' ]

21

Hier ist meine 0-Dep-Lösung für benannte Argumente:

const args = process.argv
    .slice(2)
    .map(arg => arg.split('='))
    .reduce((args, [value, key]) => {
        args[value] = key;
        return args;
    }, {});

console.log(args.foo)
console.log(args.fizz)

Beispiel:

$ node test.js foo=bar fizz=buzz
bar
buzz

Hinweis: Dies schlägt natürlich fehl, wenn das Argument a enthält =. Dies ist nur für eine sehr einfache Verwendung.



12

ohne librairies: using Array.prototype.reduce ()

const args = process.argv.slice(2).reduce((acc, arg) => {

    let [k, v = true] = arg.split('=')
    acc[k] = v
    return acc

}, {})

für diesen Befehl node index.js count=2 print debug=false msg=hi

console.log(args) // { count: '2', print: true, debug: 'false', msg: 'hi' }

ebenfalls,

wir können es ändern

    let [k, v = true] = arg.split('=')
    acc[k] = v

von (viel länger)

    let [k, v] = arg.split('=')
    acc[k] = v === undefined ? true : /true|false/.test(v) ? v === 'true' : /[\d|\.]+/.test(v) ? Number(v) : v

Boolean & Number automatisch analysieren

console.log(args) // { count: 2, print: true, debug: false, msg: 'hi' }

Ihre längere Version hat ein Problem mit Zeichenfolgen, die Punkte enthalten.
Berliner

Clevere Lösung! Was passiert , wenn ich beide unterstützen möchten countund cKommandozeilenoptionen ( cals Alias / shorcut für count)?
Alex Vang

Dies ist schön! Es wird jedoch nicht der Standard "Ein Bindestrich für eine Buchstabentaste und zwei Bindestriche für die Worttaste" verwendet. Leider ist meine Alternative zu lang und hässlich, um sie hier zu posten, daher werde ich sie als andere Antwort hinzufügen.
Isacvale

10

Das Übergeben und Parsen von Argumenten ist ein einfacher Vorgang. Node stellt Ihnen die Eigenschaft process.argv zur Verfügung, bei der es sich um ein Array von Zeichenfolgen handelt. Dies sind die Argumente, die beim Aufrufen von Node verwendet wurden. Der erste Eintrag des Arrays ist die ausführbare Node-Datei, und der zweite Eintrag ist der Name Ihres Skripts.

Wenn Sie ein Skript mit den folgenden Elementen ausführen

$ node args.js arg1 arg2

Datei: args.js

console.log(process.argv)

Sie erhalten Array wie

 ['node','args.js','arg1','arg2']

9
npm install ps-grab

Wenn Sie so etwas ausführen möchten:

node greeting.js --user Abdennour --website http://abdennoor.com 

- -

var grab=require('ps-grab');
grab('--username') // return 'Abdennour'
grab('--action') // return 'http://abdennoor.com'

Oder so etwas wie:

node vbox.js -OS redhat -VM template-12332 ;

- -

var grab=require('ps-grab');
grab('-OS') // return 'redhat'
grab('-VM') // return 'template-12332'

1
Dieses Repo ist auf Github nicht mehr verfügbar.
Steadweb

8

proj.js

for(var i=0;i<process.argv.length;i++){
  console.log(process.argv[i]);
}

Terminal:

nodemon app.js "arg1" "arg2" "arg3"

Ergebnis:

0 'C:\\Program Files\\nodejs\\node.exe'
1 'C:\\Users\\Nouman\\Desktop\\Node\\camer nodejs\\proj.js'
2 'arg1' your first argument you passed.
3 'arg2' your second argument you passed.
4 'arg3' your third argument you passed.

Erklärung:

0 : Das Verzeichnis von node.exe in Ihrer Bearbeitung (C: \ Programme \ nodejs \ node.exe ')

1: Das Verzeichnis Ihrer Projektdatei. (proj.js)

2 : Dein erstes Argument zum Knoten (arg1)

3 : Dein zweites Argument zum Knoten (arg2)

4 : Dein drittes Argument zum Knoten (arg3)

Ihre eigentlichen Argumente beginnen mit dem 2ndIndex des argvArrays process.argv[2].


7

Sie können Befehlszeilenargumente mit erreichen system.args. Und ich benutze die folgende Lösung, um Argumente in ein Objekt zu analysieren, damit ich das gewünschte mit Namen erhalten kann.

var system = require('system');

var args = {};
system.args.map(function(x){return x.split("=")})
    .map(function(y){args[y[0]]=y[1]});

Jetzt müssen Sie den Index des Arguments nicht mehr kennen. benutze es wieargs.whatever

Hinweis: Sie sollten benannte Argumente verwenden file.js x=1 y=2, um diese Lösung zu verwenden.


Kann es nicht zum Laufen bringen, mapEigenschaft ist undefiniert.
Karam

6

Sie können alle Argumente analysieren und prüfen, ob sie vorhanden sind.

Datei: parse-cli-argument.js:

module.exports = function(requiredArguments){
    var arguments = {};

    for (var index = 0; index < process.argv.length; index++) {
        var re = new RegExp('--([A-Za-z0-9_]+)=([A/-Za-z0-9_]+)'),
            matches = re.exec(process.argv[index]);

        if(matches !== null) {
            arguments[matches[1]] = matches[2];
        }
    }

    for (var index = 0; index < requiredArguments.length; index++) {
        if (arguments[requiredArguments[index]] === undefined) {
            throw(requiredArguments[index] + ' not defined. Please add the argument with --' + requiredArguments[index]);
        }
    }

    return arguments;
}

Dann tun Sie einfach:

var arguments = require('./parse-cli-arguments')(['foo', 'bar', 'xpto']);

4

Ohne Bibliotheken

Wenn Sie dies in Vanilla JS / ES6 tun möchten, können Sie die folgende Lösung verwenden

arbeitete nur in NodeJS> 6

const args = process.argv
  .slice(2)
  .map((val, i)=>{
    let object = {};
    let [regexForProp, regexForVal] = (() => [new RegExp('^(.+?)='), new RegExp('\=(.*)')] )();
    let [prop, value] = (() => [regexForProp.exec(val), regexForVal.exec(val)] )();
    if(!prop){
      object[val] = true;
      return object;
    } else {
      object[prop[1]] = value[1] ;
      return object
    }
  })
  .reduce((obj, item) => {
    let prop = Object.keys(item)[0];
    obj[prop] = item[prop];
    return obj;
  }, {});

Und dieser Befehl

node index.js host=http://google.com port=8080 production

wird das folgende Ergebnis erzeugen

console.log(args);//{ host:'http://google.com',port:'8080',production:true }
console.log(args.host);//http://google.com
console.log(args.port);//8080
console.log(args.production);//true

ps Bitte korrigieren Sie den Code in der Karte und reduzieren Sie die Funktion, wenn Sie eine elegantere Lösung finden, danke;)


1
Ich stimme zu, aber es könnte kürzer sein, nein? let args = process.argv.slice(2).reduce((acc, arg) => { let [k, v] = arg.split('=') acc[k] = v return acc }, {})
Joseph Merdrignac

4

Obwohl die obigen Antworten perfekt sind und jemand bereits Yargs vorgeschlagen hat, ist die Verwendung des Pakets wirklich einfach. Dies ist ein schönes Paket, das das Übergeben von Argumenten an die Befehlszeile sehr einfach macht.

npm i yargs
const yargs = require("yargs");
const argv = yargs.argv;
console.log(argv);

Bitte besuchen Sie https://yargs.js.org/ für weitere Informationen.


Yargs hat keinen Einfluss darauf, wie Argumente in der Befehlszeile übergeben werden. Es hilft nur beim Lesen im Code.
user3285954

4

Das Übergeben von Argumenten ist einfach, und das Empfangen von Argumenten ist nur eine Frage des Lesens des process.argv-Array-Knotens, der im Grunde genommen von überall zugänglich ist. Aber Sie möchten sie sicher als Schlüssel / Wert-Paare lesen, daher benötigen Sie ein Skript, um es zu interpretieren.

Joseph Merdrignac hat eine schöne Version mit reduct gepostet, die sich jedoch auf eine key=valueSyntax anstelle von -k valueund stützte --key value. Ich habe es viel hässlicher und länger umgeschrieben, um diesen zweiten Standard zu verwenden, und ich werde es als Antwort veröffentlichen, weil es nicht als Kommentar passen würde. Aber es erledigt den Job.

   const args = process.argv.slice(2).reduce((acc,arg,cur,arr)=>{
     if(arg.match(/^--/)){
       acc[arg.substring(2)] = true
       acc['_lastkey'] = arg.substring(2)
     } else
     if(arg.match(/^-[^-]/)){
       for(key of arg.substring(1).split('')){
         acc[key] = true
         acc['_lastkey'] = key
       }
     } else
       if(acc['_lastkey']){
         acc[acc['_lastkey']] = arg
         delete acc['_lastkey']
       } else
         acc[arg] = true
     if(cur==arr.length-1)
       delete acc['_lastkey']
     return acc
   },{})

Mit diesem Code würde ein Befehl node script.js alpha beta -charlie delta --echo foxtrotIhnen das folgende Objekt geben


args = {
 "alpha":true,
 "beta":true,
 "c":true,
 "h":true,
 "a":true,
 "r":true
 "l":true,
 "i":true,
 "e":"delta",
 "echo":"foxtrot"
}

3

Der einfachste Weg, Argumente in Node.js abzurufen, ist über das Array process.argv. Dies ist ein globales Objekt, das Sie verwenden können, ohne zusätzliche Bibliotheken zu importieren. Sie müssen lediglich Argumente an eine Node.js-Anwendung übergeben, wie wir zuvor gezeigt haben, und auf diese Argumente kann innerhalb der Anwendung über das Array process.argv zugegriffen werden.

Das erste Element des process.argv-Arrays ist immer ein Dateisystempfad, der auf die ausführbare Datei des Knotens verweist. Das zweite Element ist der Name der ausgeführten JavaScript-Datei. Und das dritte Element ist das erste Argument, das der Benutzer tatsächlich übergeben hat.

'use strict';

for (let j = 0; j < process.argv.length; j++) {  
    console.log(j + ' -> ' + (process.argv[j]));
}

Dieses Skript durchläuft lediglich das Array process.argv und druckt die Indizes zusammen mit den in diesen Indizes gespeicherten Elementen. Es ist sehr nützlich für das Debuggen, wenn Sie jemals fragen, welche Argumente Sie in welcher Reihenfolge erhalten.

Sie können auch Bibliotheken wie yargs zum Arbeiten mit Commnadline-Argumenten verwenden.


2

TypeScript-Lösung ohne Bibliotheken:

interface IParams {
  [key: string]: string
}

function parseCliParams(): IParams {
  const args: IParams = {};
  const rawArgs = process.argv.slice(2, process.argv.length);
  rawArgs.forEach((arg: string, index) => {
    // Long arguments with '--' flags:
    if (arg.slice(0, 2).includes('--')) {
      const longArgKey = arg.slice(2, arg.length);
      const longArgValue = rawArgs[index + 1]; // Next value, e.g.: --connection connection_name
      args[longArgKey] = longArgValue;
    }
    // Shot arguments with '-' flags:
    else if (arg.slice(0, 1).includes('-')) {
      const longArgKey = arg.slice(1, arg.length);
      const longArgValue = rawArgs[index + 1]; // Next value, e.g.: -c connection_name
      args[longArgKey] = longArgValue;
    }
  });
  return args;
}

const params = parseCliParams();
console.log('params: ', params);

Eingang: ts-node index.js -p param --parameter parameter

Ausgabe: { p: 'param ', parameter: 'parameter' }


1

process.argvIst Ihr Freund, wird das Erfassen von Befehlszeilenargumenten in Node JS nativ unterstützt. Siehe Beispiel unten ::

process.argv.forEach((val, index) => {
  console.log(`${index}: ${val}`);
})

0

wie in den Knotendokumenten angegeben Die Eigenschaft process.argv gibt ein Array zurück, das die Befehlszeilenargumente enthält, die beim Starten des Prozesses Node.js übergeben wurden.

Angenommen, Sie verwenden das folgende Skript für process-args.js:

// print process.argv
process.argv.forEach((val, index) => {
   console.log(`${index}: ${val}`);
});

Starten des Node.js-Prozesses als:

 $ node process-args.js one two=three four

Würde die Ausgabe erzeugen:

0: /usr/local/bin/node
1: /Users/mjr/work/node/process-args.js
2: one
3: two=three
4: four

0

Die meisten Leute haben gute Antworten gegeben. Ich möchte hier auch etwas beitragen. Ich gebe die Antwort mithilfe der lodashBibliothek, um alle Befehlszeilenargumente zu durchlaufen, die wir beim Starten der App übergeben:

// Lodash library
const _ = require('lodash');

// Function that goes through each CommandLine Arguments and prints it to the console.
const runApp = () => {
    _.map(process.argv, (arg) => {
        console.log(arg);
    });
};

// Calling the function.
runApp();

Um den obigen Code auszuführen, führen Sie einfach die folgenden Befehle aus:

npm install
node index.js xyz abc 123 456

Das Ergebnis wird sein:

xyz 
abc 
123
456

0

Der beste Weg, Befehlszeilenargumente an ein Node.js-Programm zu übergeben, ist die Verwendung einer Befehlszeilenschnittstelle (Command Line Interface, CLI).

Es gibt ein geschicktes npm-Modul namens nodejs-cli , das Sie verwenden können.

Wenn Sie eine ohne Abhängigkeiten erstellen möchten, habe ich eine auf meinem Github. Wenn Sie sie überprüfen möchten, ist sie eigentlich recht einfach und benutzerfreundlich. Klicken Sie hier .


0

Lösung ohne Abhängigkeiten im ES6-Stil:

const longArgs = arg => {
    const [ key, value ] = arg.split('=');
    return { [key.slice(2)]: value || true }
};

const flags = arg => [...arg.slice(1)].reduce((flagObj, f) => ({ ...flagObj, [f]: true }), {});


const args = () =>
    process.argv
        .slice(2)
        .reduce((args, arg) => ({
            ...args,
            ...((arg.startsWith('--') && longArgs(arg)) || (arg[0] === '-' && flags(arg)))
        }), {});
console.log(args());
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.