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.

Milchplus
quelle

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
MooGoo
quelle
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.

Mauvis Ledford
quelle
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' }
real_ate
quelle
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.

drei
quelle
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.

gor
quelle
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"
Paul van Jaarsveld
quelle
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.

Balupton
quelle
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'
}
Michael Warner
quelle
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
sgmonda
quelle
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'
Sean H. Worthington
quelle
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
quelle
@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' ]
Zlatko
quelle
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.

grebenyuksv
quelle
12

Es ist wahrscheinlich eine gute Idee, Ihre Konfiguration zentral mit nconf https://github.com/flatiron/nconf zu verwalten

Es hilft Ihnen beim Arbeiten mit Konfigurationsdateien, Umgebungsvariablen und Befehlszeilenargumenten.

250R
quelle
Und hier ist die Konfiguration , meine eigene, minimale, schreibgeschützte Schnittstelle für nconf.
Joel Purra
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' }
Joseph Merdrignac
quelle
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']
Piyush Sagar
quelle
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'
Abdennour TOUMI
quelle
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].

Nouman Dilshad
quelle
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.

Evren Kutar
quelle
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']);
Amadu Bah
quelle
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;)

Cassidy
quelle
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.

Akshay Rajput
quelle
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"
}
isacvale
quelle
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.

Rubin Bhandari
quelle
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' }

Robert Molina
quelle
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}`);
})
bhwp
quelle
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
Adeojo Emmanuel IMM
quelle
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
S.Mishra
quelle
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 .

Madhur Acharya
quelle
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());
Tibalt
quelle