Comment passer les arguments de ligne de commande à un noeud.programme js?

j'ai un serveur web écrit en noeud.js et je voudrais lancer avec un dossier spécifique. Je ne sais pas comment accéder aux arguments en JavaScript. J'exécute le noeud comme ceci:

$ node server.js folder

ici server.js est mon code serveur. Nœud.js help dit que c'est possible:

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

comment accéder à ces arguments en JavaScript? D'une façon ou d'une autre, je n'ai pas pu trouver cette information sur le web.

1841
demandé sur Grokify 2010-12-04 04:56:46

26 réponses

Méthode Standard (Pas de bibliothèque)

les arguments sont stockés dans process.argv

Voici le nœud de docs sur la manipulation de la ligne de commande args:

process.argv est un tableau contenant les arguments en ligne de commande. Le premier élément sera 'node', le second sera le nom du fichier JavaScript. La prochaine éléments supplémentaires arguments de ligne de commande.

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

cela générera:

$ 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
2430
répondu MooGoo 2016-04-15 08:49:58

pour normaliser les arguments comme une fonction javascript régulière recevrait, je le fais dans mon noeud.scripts shell js:

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

notez que le premier arg est habituellement le chemin vers nodejs, et le second arg est l'emplacement du script que vous exécutez.

496
répondu Mauvis Ledford 2015-10-04 00:44:20

L'up-to-date droit réponse à ce qu'elle utilise le minimist de la bibliothèque. Nous utilisions node-optimist mais il a été déprécié depuis.

voici un exemple d'utilisation tiré directement de la documentation minimist:

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' }
251
répondu real_ate 2014-07-08 17:26:51

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


Vanille javascript argument de l'analyse:

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


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

Minimist : pour minimum analyse des arguments.

commandant.js : la Plupart adopté module pour l'argument de l'analyse.

Meow : alternative plus légère au commandant de bord.js

Yargs : plus sophistiqué parsing argument (lourd).

Vorpale.js : Mature / ligne de commande interactive des applications avec l'argument de l'analyse.

217
répondu dthree 2018-06-20 16:57:38

Optimiste (nœud-optimist)

Check out optimist library , il est beaucoup mieux que l'analyse des options en ligne de commande à la main.

mise à Jour

Optimist est déprécié. Essayez yargs qui est une fourchette active d'optimiste.

109
répondu gor 2017-09-13 08:41:37

plusieurs grandes réponses ici, mais tout semble très complexe. C'est très similaire à la façon dont les scripts bash accèdent aux valeurs des arguments et c'est déjà fourni en standard avec node.JS comme MooGoo l'a fait remarquer. (Juste pour que ce soit compréhensible pour quelqu'un qui est nouveau au noeud.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"
72
répondu Kalemanzi 2013-12-12 05:19:54

Commandant de bord.js

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

à bref délai

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 la contribution de l'utilisateur, si vous comme l'approche du générateur.

68
répondu balupton 2013-11-11 01:50:52

Stdio Library

la façon la plus facile de traiter les arguments en ligne de commande dans NodeJS est d'utiliser le module stdio . Inspiré par UNIX getopt utilité, 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

puis ops l'objet sera le suivant:

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

pour que vous puissiez l'utiliser comme bon vous semble. Par exemple:

if (ops.kaka && ops.check) {
    console.log(ops.kaka + ops.check[0]);
}
Les options groupées

sont également supportées, vous pouvez donc écrire -om au lieu de -o -m .

de plus, stdio peut générer automatiquement une sortie aide/utilisation. 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 s'affiche également si une option obligatoire n'est pas indiquée (précédée du message d'erreur) ou si elle est mal précisée (par exemple, si vous spécifiez un seul arg pour une option et il a besoin de 2).

vous pouvez installer stdio module en utilisant NPM :

npm install stdio
40
répondu sgmonda 2013-11-25 08:35:05

si votre script s'appelle myScript.js et que vous souhaitez passer le premier et le dernier nom, "Sean Worthington", comme arguments comme ci-dessous:

node myScript.js Sean Worthington

alors 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'
34
répondu Sean H. Worthington 2017-01-18 18:24:46

"1519120920 de ligne de commande"-args vaut le coup d'oeil!

vous pouvez définir des options en utilisant les principales normes de notation ( pour en savoir plus ). Ces commandes sont toutes équivalentes, définissant les mêmes valeurs:

$ 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

pour accéder aux valeurs, créez d'abord une liste de définitions d'options décrivant les options que votre application accepte. Le type la propriété est une fonction setter (la valeur fournie est passée par là), vous donnant le contrôle total sur la valeur reçue.

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

ensuite, analysez les options en utilisant commandLineArgs () :

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

options ressemble maintenant à ceci:

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

usage avancé

à côté de l'utilisation typique ci-dessus, vous pouvez configurer la ligne de commande-args pour en accepter plus formes syntaxiques avancées.

"1519360920 de la Commande" syntaxe (git style) sous la forme:

$ executable <command> [options]

par exemple.

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

de la Commande et sous-syntaxe de la commande (menu fixe de style) sous la forme:

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

par exemple.

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

génération du Guide d'utilisation

un guide d'utilisation (généralement imprimé lorsque --help est défini) peut être généré en utilisant ligne de commande-usage . Voir les exemples ci-dessous et lire la documentation pour savoir comment les créer.

un exemple typique de guide d'utilisation.

usage

Le polymère-cli guide d'utilisation est un bon exemple.

usage

Autres Lectures

il y a beaucoup plus à apprendre, s'il vous plaît voir le wiki pour des exemples et de la documentation.

22
répondu Lloyd 2018-01-28 19:37:22

Il y a une application pour ça. Eh bien, module. Ainsi, plus d'un, sans doute des centaines.

Yargs est l'un des plus amusantes, ses docs sont cool à lire.

voici un exemple de la page GitHub / npm:

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

sortie est ici (il lit des options avec des tirets etc, court et long, numérique etc).

$ ./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' ]
19
répondu Zlatko 2017-03-20 19:44:16

c'est probablement une bonne idée de gérer votre configuration de manière centralisée en utilisant quelque chose comme nconf https://github.com/flatiron/nconf

il vous aide à travailler avec des fichiers de configuration, des variables d'environnement, des arguments en ligne de commande.

10
répondu 250R 2012-05-26 00:10:21

passer, analyser les arguments est un processus facile. Nœud fournit vous avec le processus.la propriété argv, qui est un tableau de chaînes, qui sont les arguments qui ont été utilisés lorsque le noeud a été invoqué. La première entrée du tableau est le Nœud de l'exécutable, et la seconde entrée est le nom de votre script.

si vous exécutez script avec ci-dessous atguments

$ node args.js arg1 arg2

fichier : args.js

console.log(process.argv)

vous obtiendrez un tableau comme

 ['node','args.js','arg1','arg2']
9
répondu Piyush Sagar 2016-01-11 14:54:38

without librairies: using Array.prototype.réduire () 151970920"
const args = process.argv.slice(2).reduce((acc, arg) => {

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

}, {})

pour cette commande node index.js count=2 print debug=false msg=hi

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

aussi,

nous pouvons changer

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

par (beaucoup plus long)

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

auto analyser Boolean & Numéro de

console.log(args) // { count: 2, print: true, debug: false, msg: 'hi' }
7
répondu Joseph Merdrignac 2017-10-19 18:41:25

vous pouvez analyser tous les arguments et vérifier s'ils existent.

fichier: parse-cli-arguments.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;
}

Que viens de faire:

var arguments = require('./parse-cli-arguments')(['foo', 'bar', 'xpto']);
6
répondu Amadu Bah 2013-12-11 11:18:47
npm install ps-grab

Si vous voulez exécuter quelque chose comme ceci :

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

--

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

Ou quelque chose comme :

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

--

var grab=require('ps-grab');
grab('-OS') // return 'redhat'
grab('-VM') // return 'template-12332'
6
répondu Abdennour TOUMI 2016-07-23 20:37:36

vous pouvez atteindre les arguments en ligne de commande en utilisant system.args . Et j'utilise la solution ci-dessous pour analyser les arguments dans un objet, de sorte que je peux obtenir celui que je veux par son nom.

var system = require('system');

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

maintenant, vous n'avez pas besoin de connaître l'indice de l'argument. utilisez-le comme args.whatever

Note: vous devez utiliser des arguments nommés comme file.js x=1 y=2 pour utiliser cette solution.

5
répondu Evren Kutar 2016-08-10 13:38:30

proj.js

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

Terminal:

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

résultat:

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.

explication:

0 : le répertoire du noeud.exe in your maching (C:\Program Files\nodejs\node.exe') 1519140920"

1 : Le répertoire de votre projet fichier. (proj.js)

2 : votre premier argument pour le noeud (arg1)

3 : votre deuxième argument à node (arg2)

4 : votre troisième argument à node (arg3)

vos arguments réels commencent le formulaire 2nd index du tableau argv , c'est-à-dire process.argv[2] .

4
répondu Nouman Dilshad 2018-07-02 14:19:48

voici ma solution 0-dep pour les arguments nommés:

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)

exemple:

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

Note: naturellement cela échouera lorsque l'argument contient un = . C'est seulement pour un usage très simple.

3
répondu grebenyuksv 2018-08-09 15:21:41

sans bibliothèques

si vous voulez le faire à la vanille JS / ES6 vous pouvez utiliser la solution suivante

ouvré uniquement en Ndejs > 6 "151990920

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;
  }, {});

et cette commande

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

produira le résultat suivant

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

p. S. S'il vous plaît corriger le code dans la carte et réduire la fonction si vous trouvez une solution plus élégante, merci ;)

2
répondu Cassidy 2017-10-04 23:07:02

la façon la plus simple de récupérer les arguments dans le noeud.js passe par le processus.tableau argv. C'est un objet global que vous pouvez utiliser sans avoir à importer des bibliothèques supplémentaires pour l'utiliser. Vous avez simplement besoin de passer des arguments à un noeud.js application, comme nous l'avons montré plus tôt, et ces arguments peuvent accéder à l'application via le processus.tableau argv.

Le premier élément du processus.argv array sera toujours un chemin de système de fichier pointant vers le noeud exécutable. Le deuxième élément est le nom du fichier JavaScript qui est exécuté. Et le troisième élément est le premier argument qui a été effectivement passé par l'utilisateur.

'use strict';

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

ce script ne fait que boucler le processus.tableau argv et imprime les indices, ainsi que les éléments stockés dans ces indices. C'est très utile pour déboguer si vous vous interrogez sur les arguments que vous recevez, et dans quel ordre.

Vous pouvez également utiliser les bibliothèques comme yargs pour travailler avec les arguments commnadline.

1
répondu Rubin bhandari 2018-05-22 11:36:44

comme indiqué dans le node docs Processus.la propriété argv renvoie un tableau contenant les arguments de ligne de commande passés lorsque le noeud.le processus js a été lancé.

par exemple, en supposant le script suivant pour process-args.js:

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

lancement du noeud.processus js as:

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

générerait la sortie:

0: /usr/local/bin/node
1: /Users/mjr/work/node/process-args.js
2: one
3: two=three
4: four
0
répondu Adeojo Emmanuel IMM 2018-04-24 00:14:00

la Plupart des gens ont donné de bonnes réponses. Je tiens également à contribuer à quelque chose ici. Je fournis la réponse en utilisant la bibliothèque lodash pour itérer tous les arguments de ligne de commande que nous passons en démarrant l'application:

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

pour exécuter le code ci-dessus, exécutez les commandes suivantes:

npm install
node index.js xyz abc 123 456

le résultat sera:

xyz 
abc 
123
456
0
répondu S.Mishra 2018-04-25 16:56:31

process.argv est votre ami, la capture de ligne de commande args est nativement supporté dans le noeud JS. Voir l'exemple ci-dessous:

process.argv.forEach((val, index) => {
  console.log(`${index}: ${val}`);
})
0
répondu bhwp 2018-06-08 10:35:23

vous pouvez également utiliser le paquet yargs il sera beaucoup plus facile! ici, vous allez :) Yargs

-1
répondu Rajakumar 2018-04-27 03:50:49

un simple extrait en cas de besoin:

var fs = require('fs'), objMod = {};

process.argv.slice(2).map(function(y, i) {
  y = y.split('=');
  if (y[0] && y[1]) objMod[y[0]] = y[1];
  else console.log('Error in argument number ' + (i+1));
});
-3
répondu Casy 2017-06-07 22:01:33