如何将命令行参数传递给 Node.js 程序?

我有一个用Node.js编写的 Web 服务器,我想使用一个特定的文件夹启动。我不确定如何在 JavaScript 中访问参数。我正在像这样运行节点:

$ node server.js folder

这是server.js是我的服务器代码。 Node.js 帮助说这是可能的:

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

如何在 JavaScript 中访问这些参数?不知何故,我无法在网上找到此信息。

答案

标准方法(无库)

参数存储在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

为了使参数像常规的 javascript 函数一样标准化,我在 node.js shell 脚本中执行以下操作:

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

请注意,第一个 arg 通常是 nodejs 的路径,第二个 arg 是您正在执行的脚本的位置。

为此,它使用极简库来提供正确的答案。我们曾经使用节点优化器,但此后不推荐使用。

这是一个如何使用它的示例,直接摘自简约文档:

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

基于当前野外趋势的 2018 年答案:


香草 javascript 参数解析:

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 :最常用的参数解析模块。

喵喵 :Commander.js 的更轻巧的替代品

Yargs :更复杂的参数解析(繁重)。

Vorpal.js :具有参数解析功能的成熟 / 交互式命令行应用程序。

乐观主义者(节点最优主义者)

查看乐观主义者库 ,它比手工分析命令行选项要好得多。

更新资料

不赞成使用乐观主义者。尝试yargs ,它是乐观主义者的积极分支。

这里有几个很好的答案,但这似乎非常复杂。这与 bash 脚本访问参数值的方式非常相似,并且正如 MooGoo 所指出的那样,它已作为标准提供给 node.js。 (只是使它对于 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"

Commander.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, required: 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

如果未给出强制性选项(错误消息之前)或如果选项不明确(例如,如果您为选项指定单个 arg 并且需要 2),则还会显示上一条消息。

您可以使用NPM安装stdio模块:

npm install stdio

如果您的脚本名为 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'

没有标志格式化为简单对象的库

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