Menu

Node.js process.argv: Kommandozeilenargumente lesen

process.argv ist ein Array mit der Kommandozeile, die dein Programm gestartet hat: die node-Programmdatei, der Pfad des Skripts, dann jedes Argument, das du eingegeben hast. Mit process.argv.slice(2) bekommst du nur deine Argumente.

Diese Seite enthält ausführbare Editoren. Bearbeiten, ausführen und Ausgabe sofort sehen.

process.argv ist ein Array mit der Kommandozeile, die dein Node.js-Programm gestartet hat. Index 0 ist der Pfad zur Programmdatei node, Index 1 der Pfad zu deinem Skript, und deine eigenen Argumente beginnen bei Index 2. process.argv.slice(2) gibt dir also genau das, was der Nutzer nach dem Dateinamen eingegeben hat, immer als Strings.

Die ersten beiden Einträge sind vollständige Pfade, deshalb gibt das Beispiel nur ihren letzten Teil aus (node und index.js), dann [ 'Ada', '42', '--verbose' ]. Ändere die Argumentzeile in Grace 7 und führ es noch einmal aus: Das Array zieht mit.

Was in process.argv landet

Die Shell teilt die Zeile nach node an Leerzeichen und gibt Node.js die Teile. Flags vor dem Dateinamen gehören zu Node.js selbst, nicht zu deinem Programm:

node --max-old-space-size=4096 index.js --port=8080
# process.argv.slice(2) is [ '--port=8080' ]
# process.execArgv is      [ '--max-old-space-size=4096' ]

Anführungszeichen fassen Wörter zu einem Argument zusammen ("Ada Lovelace" kommt als ein einziger String an), und die Shell erweitert Muster wie *.txt zu Dateinamen, bevor Node.js sie überhaupt sieht.

Die Argumente mit slice(2) holen

Die meisten Skripte zerlegen die erwarteten Argumente per Destructuring und geben jedem einen Standardwert:

Es hat Hello, Ada ausgegeben: Ein Argument hat name gefüllt, und greeting ist auf seinen Standardwert zurückgefallen. Füg in der Argumentzeile Hi nach Ada hinzu, und es gibt Hi, Ada aus; leere die Zeile, und du bekommst Hello, world.

Zahlen kommen als Strings an

Die Shell kennt keine Typen. Jedes Argument ist ein String, Rechnen damit geht also schief, bis du umwandelst:

a + b hat die Strings zu 75 verbunden, und Number() hat 12 ergeben. Ein Wort, das keine Zahl ist, wird zu NaN, prüf also mit Number.isNaN und gib eine Benutzungshilfe aus, statt mit einem kaputten Wert weiterzumachen.

--name=value-Flags von Hand parsen

Für ein paar Flags reicht eine kurze Schleife. Diese macht aus --port=8080 port: '8080', aus einem einzelnen --verbose true und behält alles andere als Positionsargument:

Es hat {"port":"8080","verbose":true} und [ 'build', 'src' ] ausgegeben, wobei port noch ein String ist. Diese Schleife kann keine kurzen Flags wie -p und keinen Wert im nächsten Argument (--port 8080); dafür nimm den eingebauten Parser unten.

util.parseArgs, der eingebaute Parser

Node.js 18.3 und neuer bringen util.parseArgs mit, das lange und kurze Flags, Werte im nächsten Argument, Booleans und Standardwerte behandelt:

const { parseArgs } = require('node:util');

// node index.js -p 8080 --verbose src
const { values, positionals } = parseArgs({
    options: {
        port: { type: 'string', short: 'p', default: '3000' },
        verbose: { type: 'boolean', short: 'v' },
    },
    allowPositionals: true,
});

console.log(values);      // [Object: null prototype] { port: '8080', verbose: true }
console.log(positionals); // [ 'src' ]

parseArgs liest standardmäßig process.argv.slice(2). Es wirft bei einer Option, die du nicht deklariert hast, und fängt so Tippfehler wie --prot; übergib strict: false, um unbekannte Flags zu akzeptieren. Als Optionstypen gibt es nur string und boolean, Zahlen brauchen also weiterhin Number(). values ist ein Objekt ohne Prototyp, deshalb erscheint es mit [Object: null prototype]; lies es wie jedes Objekt.

Häufige Fehler

process.argv[0] als erstes Argument lesen. Das ist der Pfad zu node. Dein erstes Argument ist process.argv[2].

Vergessen, dass alles ein String ist. '10' > '9' ist false, weil Strings Zeichen für Zeichen verglichen werden. Wandle zuerst um.

Geheimnisse in Argumente packen. Kommandozeilen landen in der Shell-History und in Prozesslisten, die andere Nutzer auf dem Rechner lesen können. Übergib Passwörter und API-Keys stattdessen über Umgebungsvariablen.

Häufig gestellte Fragen

Wie übergebe ich Argumente an ein npm-Skript?

Schreib sie nach --: npm run start -- --port=4000. npm gibt alles nach dem -- an dein Skript weiter, wo es in process.argv.slice(2) auftaucht.

Warum ist process.argv[2] undefined?

Weil das Programm ohne dieses Argument gestartet wurde. Gib ihm einen Standardwert (process.argv[2] ?? 'guest') oder gib eine Zeile zur Benutzung aus und beende mit process.exit(1).

Sollte ich yargs oder commander statt process.argv nehmen?

Für ein Skript mit ein paar Flags ist util.parseArgs eingebaut und reicht aus. Pakete wie commander und yargs bringen Hilfetexte, Unterbefehle und Validierung mit, was sich lohnt, sobald dein Tool mehrere Befehle hat.

Illustration der Programmiersprachen bei Coddy

Lerne mit Coddy zu programmieren

Los geht's