Question Comment passer des arguments de ligne de commande à un programme Node.js?


J'ai un serveur web écrit en Node.js et je voudrais lancer avec un dossier spécifique. Je ne suis pas sûr comment accéder aux arguments en JavaScript. Je cours le noeud comme ceci:

$ node server.js folder

ici server.js est mon code serveur. L'aide de Node.js dit que c'est possible:

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

Comment accéder à ces arguments en JavaScript? D'une manière ou d'une autre, je n'ai pas réussi à trouver cette information sur le Web.


1764
2017-12-04 01:56


origine


Réponses:


Méthode standard (pas de bibliothèque)

Les arguments sont stockés dans process.argv

Voici le nœud docs sur la gestion des arguments de la ligne de commande:

process.argv est un tableau contenant les arguments de la ligne de commande. Le premier élément sera 'node', le second élément sera le nom du fichier JavaScript. Les éléments suivants seront des arguments de ligne de commande supplémentaires.

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

Cela va générer:

$ 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

2344
2017-12-04 02:05



Pour normaliser les arguments comme une fonction javascript normale recevrait, je le fais dans mes scripts shell node.js:

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

Notez que le premier argument est généralement le chemin de nodejs, et le second arg est l'emplacement du script que vous exécutez.


472
2018-04-23 23:13



La mise à jour droite répondre à cela pour utiliser le minimiste bibliothèque. Nous avions l'habitude d'utiliser noeud-optimiste mais il a depuis été déprécié.

Voici un exemple de comment l'utiliser directement dans la documentation du minimiste:

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

234
2017-07-08 17:26



2018 réponse basée sur les tendances actuelles dans la nature:


Argument de vanilla javascript:

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

Cela renvoie:

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

Documents officiels


Les paquets NPM les plus utilisés pour l'analyse des arguments:

Minimist: Pour l'analyse d'arguments minimale.

Commander.js: Module le plus adopté pour l'analyse d'arguments.

Miaou: Alternative plus légère à Commander.js

Yargs: Argument d'analyse plus sophistiqué (lourd).

Vorpal.js: Applications de ligne de commande matures / interactives avec analyse d'arguments.


203
2018-01-14 05:26



Optimiste (nœud-optimiste)

Check-out bibliothèque optimiste, c'est beaucoup mieux que d'analyser les options de la ligne de commande à la main.

Mettre à jour

Optimist est obsolète. Essayer yargs qui est une fourchette active d'optimiste.


107
2017-07-04 04:02



Plusieurs bonnes réponses ici, mais tout cela semble très complexe. Ceci est très similaire à la façon dont les scripts bash accèdent aux valeurs des arguments et il est déjà fourni standard avec node.js comme l'a indiqué MooGoo. (Juste pour le rendre compréhensible à quelqu'un qui est nouveau à node.js)

Exemple:

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

68
2017-12-12 05:19



Commander.js

Fonctionne très bien pour définir vos options, actions et arguments. Il génère également les pages d'aide pour vous.

Rapidement

Fonctionne très bien pour obtenir des entrées de l'utilisateur, si vous aimez l'approche de rappel.

Co-Prompt

Fonctionne très bien pour obtenir des commentaires de l'utilisateur, si vous aimez l'approche générateur.


65
2017-09-20 10:20



Bibliothèque Stdio

Le moyen le plus simple d'analyser les arguments de ligne de commande dans NodeJS est d'utiliser le stdio module. Inspiré par UNIX getopt utilitaire, il est aussi trivial que suit:

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

Si vous exécutez le code précédent avec cette commande:

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

alors ops l'objet sera comme suit:

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

Vous pouvez donc l'utiliser comme vous le souhaitez. Par exemple:

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

Les options groupées sont également supportées, ainsi vous pouvez écrire -om au lieu de -o -m.

En outre, stdio peut générer une sortie d'aide / utilisation automatiquement. Si vous appelez ops.printHelp() vous obtiendrez ce qui suit:

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

Le message précédent est également montré si une option obligatoire n'est pas donnée (précédée par le message d'erreur) ou si elle est mal spécifiée (par exemple, si vous spécifiez un argument unique pour une option et qu'elle a besoin de 2).

Vous pouvez installer stdio module utilisant NPM:

npm install stdio

35
2017-08-13 10:30



Si votre script s'appelle myScript.js et que vous voulez passer le prénom et le nom, 'Sean Worthington', comme arguments comme ci-dessous:

node myScript.js Sean Worthington

Ensuite, dans votre script, vous écrivez:

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

28
2018-06-17 00:04