javascript - 如何将命令行参数传递到Node.js ?

  显示原文与译文双语对照的内容

这可能只是一个JavaScript问题。 我有一个用 Node.js 编写的web服务器,我想用一个特定的文件夹启动它。 我不确定如何访问JavaScript中的参数。 我正在运行这样的节点


$ node server.js folder

server.js 是我的代码。 node.js 帮助说明这是有可能的:


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

我如何在JavaScript中访问这些参数? 不知怎么,我在网上找不到这些信息。

时间:

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


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

注意,第一个参数通常是到nodejs的路径,第二个参数是你正在执行的脚本的位置。

编辑:在JavaScript中使用"strict模式"? 你需要执行以下操作:


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

Commander.js

对定义选项,动作和参数非常有用。 它还为你生成帮助页面。

立即

如果你喜欢回调方法,可以很好地从用户那里获得输入。

Co-Prompt

如果你喜欢生成器方法,那么从用户那里获得输入效果很好。

href库

在NodeJS正在使用该 stdio.h module,的最简单的方法来解析 command-line arguments. 受到 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

如果没有指定强制选项( 前面是错误消息) 或者 mispecified ( 例如如果指定一个选项的单个参数并且它需要 2 ),则显示上一条消息。

使用 NPM, stdio.h可以安装 module:

 
npm install stdio

 

这里有几个不错的答案,但看起来很复杂。 这非常类似于bash脚本访问参数值的方式,它已经为 node.js 提供了标准,如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"

要使用的最新的正确的答案这个它了 minimist 库。 我们曾经使用过 node-optimist,但它已经被否决了。

下面是如何使用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' }

如果你的脚本被称为 myScript.js,你想要传递第一个和最后一个名称'sean沃辛顿',如下所示:


node myScript.js Sean Worthington

然后在你的脚本中编写:


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

这里有一个应用。 嗯,模块。嗯,不止一个,可能是几百个。

Yargs 是一个有趣的工具,它的文档很酷。

下面是来自 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' ]

...