web-dev-qa-db-ja.com

Node.jsプログラムにコマンドライン引数を渡すにはどうすればいいですか?

Node.js に書かれたWebサーバーがあり、特定のフォルダで起動したいのですが。 JavaScriptで引数にアクセスする方法がわかりません。私はこのようにノードを実行しています:

$ node server.js folder

ここでserver.jsは私のサーバーコードです。 Node.jsのヘルプによると、これは可能です。

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

JavaScriptでこれらの引数にアクセスする方法どういうわけか私はウェブ上でこの情報を見つけることができませんでした。

2126
milkplus

標準方式(ライブラリなし)

引数はprocess.argvに格納されています

これは コマンドライン引数の取り扱いに関するノードのドキュメントです:

process.argvは、コマンドライン引数を含む配列です。最初の要素は 'node'になり、2番目の要素はJavaScriptファイルの名前になります。次の要素は、追加のコマンドライン引数です。

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

これは生成します:

$ 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
2660
MooGoo

通常のJavaScript関数が受け取るように引数を正規化するために、私はこれを私のnode.jsシェルスクリプトで行います。

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

最初の引数は通常nodejsへのパス、2番目の引数は実行しているスクリプトの場所です。

549
Mauvis Ledford

これに対する最新の right 答えは minimist ライブラリを使うことです。以前は node-optimist を使用していましたが、それ以降は非推奨になりました。 

これはミニマリストのドキュメントから直接取った使い方の例です:

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

野生の現在の傾向に基づく2018年の答え:


バニラジャバスクリプト引数の解析:

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

これは

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

公式ドキュメント


引数解析にNPMパッケージをほとんど使用しました。

Minimist:引数の解析を最小限にします。

Commander.js:引数解析に最も採用されているモジュール。

Meow:Commander.jsに代わる軽量なもの

Yargs:より高度な引数解析(重い)。

Vorpal.js:引数解析機能を備えた成熟した対話型のコマンドラインアプリケーション。

253
dthree

楽観主義者(ノード楽観主義者)

optimist library をチェックしてください。コマンドラインオプションを手動で解析するよりもはるかに優れています。

更新

楽観主義者は非推奨です。 yargs を試してください。これは楽観主義者の活発な分岐です。

114
gor

いくつかの素晴らしい答えがここにありますが、すべて非常に複雑に思えます。これは、bashスクリプトが引数値にアクセスする方法と非常によく似ており、MooGooが指摘したように、すでにnode.jsに標準で提供されています。

例:

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

Commander.js

オプション、アクション、引数を定義するのに最適です。それはまたあなたのためのヘルプページを生成します。

早急に

あなたがコールバックアプローチを好むならば、ユーザーからの入力を得るのに素晴らしい作品。

コプロンプト

あなたがジェネレータのアプローチが好きなら、ユーザからの入力を得るのに最適です。

70
balupton

スタジオライブラリー

NodeJSでコマンドライン引数を解析する最も簡単な方法は stdio モジュールを使うことです。 UNIXのgetoptユーティリティに着想を得たもので、次のように簡単です。

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

このコマンドで前のコードを実行すると、

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

opsオブジェクトは次のようになります。

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

だからあなたはあなたが望むようにそれを使用することができます。例えば:

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

グループ化されたオプションもサポートされているので、-omの代わりに-o -mを書くことができます。

さらに、stdioは自動的にhelp/usageの出力を生成します。 ops.printHelp()を呼び出すと、次のようになります。

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

前のメッセージは、必須オプションが指定されていない場合(エラーメッセージが前に表示される場合)、または誤って指定されている場合(例えば、オプションに単一のargを指定して2が必要な場合)にも表示されます。

_ npm _ を使用して stdio moduleをインストールできます。

npm install stdio
41
sgmonda

あなたのスクリプトがmyScript.jsという名前で、姓と名、 'Sean Worthington'を以下のような引数として渡したい場合は、

node myScript.js Sean Worthington

それからあなたのスクリプトの中であなたは書く:

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

command-line-args は一見の価値があります!

あなたは主要な記法標準を使ってオプションを設定することができます( もっと詳しく )。これらのコマンドはすべて同等で、同じ値を設定します。

$ 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

値にアクセスするには、最初に オプション定義 のリストを作成し、アプリケーションが受け付けるオプションを記述します。 type プロパティは設定関数で(提供された値はこれを通して渡されます)、受け取った値を完全に制御することができます。

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

次に、 commandLineArgs() を使用してオプションを解析します。

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

optionsはこのようになりました:

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

高度な使い方

上記の典型的な使用法の他に、より高度な構文形式を受け入れるようにcommand-line-argsを設定できます。

コマンドベースの構文 (git style):

$ executable <command> [options]

例えば。

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

コマンドおよびサブコマンドの構文 (docker style):

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

例えば。

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

利用ガイド作成

使用法ガイド(通常は--helpが設定されているときに印刷されます)は command-line-usage を使って生成できます。それらを作成する方法については以下の例を参照してください、そして ドキュメントを読んでください

典型的な使用法ガイドの例。

usage

polymer-cli usageガイドは良い実例です。

usage

参考文献

学ぶべきことはまだたくさんあります。例とドキュメントについては wiki を参照してください。

23
Lloyd

そのためのアプリがあります。まあ、モジュール。ええと、1つ以上、おそらく数百もあります。

Yargs は楽しいものの1つです、そのドキュメントは読むのがクールです。

これがgithub/npmページの例です。

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

出力はここにあります(ダッシュなどのオプション、短い、長い、数値などのオプションがあります).

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

フラグ付きのライブラリが単純なオブジェクトにフォーマットされていない

function getArgs () {
  const args = {}
  process.argv
    .slice(2, process.argv.length)
    .forEach( arg => {
      // long arg
      if (arg.slice(0,2) === '--') {
        const longArg = arg.split('=')
        args[longArg[0].slice(2,longArg[0].length)] = longArg[1]
      }
     // 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)

単純な

入力

node test.js -D --name=Hello

出力

{ D: true, name: 'Hello' }

現実の世界

入力

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

出力

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

ライブラリなしで:Array.prototype.reduce()を使う

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

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

}, {})

このコマンドではnode index.js count=2 print debug=false msg=hi

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

また、

私達は変えることができます 

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

までに(はるかに)

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

ブール&数値を自動解析する

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

nconf https://github.com/flatiron/nconf のようなものを使って一元管理された方法であなたの設定を管理することはおそらく良い考えです。

設定ファイル、環境変数、コマンドライン引数を扱うのに役立ちます。

10
250R

引数を渡して解析するのは簡単なプロセスです。 Nodeはprocess.argvプロパティを提供します。これは文字列の配列で、Nodeが呼び出されたときに使用された引数です。 配列の最初のエントリはNode実行可能ファイルで、2番目のエントリはスクリプトの名前です。 

以下の引数でスクリプトを実行した場合

$ node args.js arg1 arg2

ファイル:args.js

console.log(process.argv)

あなたは配列のようになるでしょう

 ['node','args.js','arg1','arg2']
9
Piyush Sagar

これが名前付き引数に対する0-depの解決策です。

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)

例:

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

注:引数が=を含む場合、当然これは失敗します。これは非常に単純な使い方のためだけのものです。

9
grebenyuksv
npm install ps-grab

あなたがこのような何かを実行したい場合は:

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

-

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

それとも何か: 

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

-

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

system.argsを使用してコマンドライン引数にアクセスできます。そして、私は引数をオブジェクトにパースするために以下の解決策を使うので、私は自分が欲しいものを名前で得ることができます。

var system = require('system');

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

今、あなたは議論のインデックスを知る必要はありません。 args.whateverのように使ってください

注意:この解決法を使うにはfile.js x=1 y=2のような名前付き引数を使うべきです。

6
Evren Kutar

すべての引数を解析してそれらが存在するかどうかを確認できます。 

file: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;
}

ただするよりも:

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

proj.js

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

ターミナル:

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

結果:

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.

説明:

0:あなたの機械のnode.exeのディレクトリ(C:\ Program Files\nodejs\node.exe ')

1:プロジェクトファイルのディレクトリ(proj.js)

2:ノードへの最初の引数(arg1)

3:ノードへの2番目の引数(arg2)

4:ノードへの3番目の引数(arg3)

実際の引数は、argv配列の2ndインデックスの形式、つまりprocess.argv[2]で始まります。

5
Nouman Dilshad

ライブラリなし

Vanilla JS/ES6でこれを行いたい場合は、次の解決策を使用できます。

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

そしてこのコマンド

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

次のような結果になります

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より洗練された解決策を見つけたら、mapのコードを修正してfunction を減らしてください。ありがとう。

4
Cassidy

Node.jsで引数を取得する最も簡単な方法は、process.argv配列を使用することです。これは、追加のライブラリをインポートしなくても使用できるグローバルオブジェクトです。前に示したように、単にNode.jsアプリケーションに引数を渡すだけでよく、これらの引数はprocess.argv配列を介してアプリケーション内でアクセスできます。

Process.argv配列の最初の要素は、常にノード実行可能ファイルを指すファイルシステムパスです。 2番目の要素は、実行されているJavaScriptファイルの名前です。そして3番目の要素は、実際にユーザーによって渡された最初の引数です。

'use strict';

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

このスクリプトは、process.argv配列をループ処理して、それらのインデックスに格納されている要素とともにインデックスを出力します。どんな引数を受け取っているのか、そしてどんな順番であなたが疑問に思うのであれば、デバッグに非常に役に立ちます。

Commnadline引数を扱うためにyargsのようなライブラリを使うこともできます。

3
Rubin bhandari

上記の答えは完璧で、誰かがすでに引数を提案していますが、パッケージを使うのは本当に簡単です。

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

詳細については https://yargs.js.org/ をご覧ください。

1
Akshay Rajput

ほとんどの人が良い答えを出しています。ここでも何か貢献したいと思います。私はアプリの起動中に渡したすべてのコマンドライン引数を繰り返すためにlodashライブラリを使用して答えを提供しています。

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

上記のコードを実行するには、以下のコマンドを実行するだけです。

npm install
node index.js xyz abc 123 456

結果は次のようになります。

xyz 
abc 
123
456
0
S.Mishra

コマンドライン引数をNode.jsプログラムに渡す最良の方法は、コマンドラインインタフェース(CLI)を使用することです。

nodejs-cli という気の利いたnpmモジュールがあります。

依存関係のないものを作成したい場合は、Githubで確認してみてください。実際にはとてもシンプルで使いやすいので、 here をクリックしてください。

0
madhur acharya

node docs に記載されているように、process.argvプロパティは、Node.jsプロセスの起動時に渡されたコマンドライン引数を含む配列を返します。

たとえば、process-args.jsに次のスクリプトがあるとします。

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

Node.jsプロセスを次のように起動します。

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

出力を生成します:

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

process.argvはあなたの友人です、コマンドライン引数をキャプチャすることはNode JSでネイティブにサポートされています。以下の例を参照してください。

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

引数を渡すのは簡単です、そして、それらを受け取ることは単にprocess.argv配列Nodeを読むことの問題です、基本的に、Nodeはどこからでもアクセス可能にします。しかし、それらをキーと値のペアとして読みたいのは間違いないので、それを解釈するためのスクリプトを作成するためのピースが必要になります。

Joseph Merdrignacはreduceを使用して美しいものを投稿しましたが、key=valueおよび-k valueの代わりに--key value構文に依存しました。私はその2番目の標準を使用することをはるかに厄介でより長く書き直しました、そしてそれが解説として合わないので答えとしてそれを掲載するつもりです。しかし、それは仕事をやり遂げます。

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

このコードでコマンドnode script.js alpha beta -charlie delta --echo foxtrotはあなたに次のオブジェクトを与えるでしょう


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