javascript - runoob - node帶參數




如何將命令行參數傳遞給nodejs程序? (15)

我有一個用Node.js編寫的Web服務器,我想用特定的文件夾啟動。 我不確定如何訪問JavaScript中的參數。 我像這樣運行節點:

$ node server.js folder

這裡server.js是我的服務器代碼。 Node.js的幫助說這是可能的:

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

我將如何訪問JavaScript中的這些參數? 不知何故,我無法在網上找到這些信息。


2018年答案根據目前的野外趨勢:

Vanilla javascript參數解析:

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

這返回:

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

官方文檔

大多數用於參數分析的NPM軟件包:

Minimist :用於最小參數分析。

Commander.js :用於參數解析的最常用模塊。

Meow :替代Commander.js的更輕

Yargs :更複雜的參數解析(重)。

Vorpal.js :具有參數解析的成熟/交互式命令行應用程序。


Stdio圖書館

在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可以自動生成幫助/使用輸出。 如果你調用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

如果沒有給出強制選項(在錯誤消息前面),或者錯誤指定了(例如,如果為選項指定單個參數並且它需要2),則會顯示前一條消息。

您可以使用NPM安裝stdio模塊:

npm install stdio

樂觀主義者(節點樂觀主義者)

查看樂觀主義庫 ,它比手工解析命令行選項要好得多。

更新

樂觀主義者已被棄用。 嘗試yargs的活躍分支。


標準方法(無庫)

參數存儲在process.argv

以下是處理命令行參數的節點文檔:

process.argv是一個包含命令行參數的數組。 第一個元素將是'node',第二個元素將是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

沒有圖書館

如果你想在香草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如果你找到更優雅的解決方案,請更正地圖中的代碼並減少功能,謝謝;)


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屬性是一個setter函數(所提供的值將通過此函數傳遞),使您可以完全控制接收到的值。

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
}

高級用法

除上述典型用法外,您可以配置命令行參數以接受更高級的語法形式。

基於命令的語法 (git樣式),格式如下:

$ 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生成。 請參閱下面的示例並command-line-usage以獲取如何創建它們的說明。

一個典型的使用指南示例。

polymer-cli使用指南是一個很好的現實生活中的例子。

進一步閱讀

還有很多東西需要學習,請參閱wiki以獲取示例和文檔。


你也可以使用yargs包,它會使事情變得更容易! 在這裡你去:) Yargs


你可以使用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這樣的命名參數來使用此解決方案。


傳遞,解析參數是一個簡單的過程。 Node為您提供了process.argv屬性,它是一個字符串數組,它是調用Node時使用的參數。 數組的第一個條目是Node可執行文件,第二個條目是腳本的名稱。

如果你用下面的參數運行腳本

$ node args.js arg1 arg2

文件:args.js

console.log(process.argv)

你會得到像陣列

 ['node','args.js','arg1','arg2']

大多數人都給出了很好的答案。 我也想在這裡貢獻一些東西。 我使用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

如節點文檔中所述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

最新的正確答案為它使用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' }

為了像普通的javascript函數那樣標準化參數,我在我的node.js shell腳本中執行了這個操作:

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

請注意,第一個參數通常是nodejs的路徑,第二個參數是您正在執行的腳本的位置。


nconf https://github.com/flatiron/nconf來集中管理你的配置可能是一個好主意

它可以幫助您處理配置文件,環境變量,命令行參數。


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'




command-line-arguments