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


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

$ node server.js folder

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

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

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


1775
2017-12-04 01:56


起源




答案:


标准方法(无库)

参数存储在 process.argv

这是 关于处理命令行args的节点文档:

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

2356
2017-12-04 02:05



是。谢谢。的console.log(process.argv [2]);打印我的文件夹 - milkplus
我应该在命令提示符下输入什么来运行带有命令行参数的node.js脚本? - Anderson Green
更新:我找到了上述问题的答案。 stackoverflow.com/questions/12925802/... - Anderson Green
Minimist 是一个伟大而简单的参数解析器 - Guilherme Nagatomo
当您知道其位置时,您还可以访问单个参数: process.argv[n] 哪里 n 是从零开始的指数 - Luca Steeb


要像普通的javascript函数那样规范化参数,我会在node.js shell脚本中执行此操作:

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

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


479
2018-04-23 23:13



谢谢Jaseem。很想看看未来规范中的内容。它会破坏这么多的js库...... - Mauvis Ledford
这个答案对我来说比直接来自NodeJS文档的第一个答案更有用。至少它帮助我实现了我的目标。 - JohnAllen
只是说明我4年前写过这个答案,而我正在运行的代码今天仍然运行100%。仍然保持最新版本的节点和最新版本的问题:它只是一个简单的shell脚本人。不是充满JS库的大型全局对象的一部分。我今天仍然支持我的答案。我将在4年后再发一次更新。 - Mauvis Ledford
var args = process.argv.splice(process.execArgv.length + 2); //因为节点命令使用有例外,例如: node --harmony script.js balala。看到 process.execArgv - cuixiping
@cuixiping但是 execArgv 是 不 在 argv 所以2就足够了 - Tommi Kyntola


最新的  为此回答它使用 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' }

239
2017-07-08 17:26



实际上,这个解决方案对于开发具有更多标志和参数的命令行工具更有帮助,并且应该被更多恕我直言。 - JK ABC
Imo,这是一个更简单的替代方案 npmjs.com/package/command-line-args - klodoma
@JKABC我不会称这是最正确的答案,因为OP只是要求访问琐碎的命令行信息。但我同意,如果您计划扩展CLI,则minimist和命令行参数都非常有用。 - Justus Romijn
我想知道为什么'-n5'不会产生'n5:true' - 这对我来说是有道理的。 - Max Waterman
@MaxWaterman:因为以单个破折号开头的选项只能用于单个字符。将单个char选项后面的任何内容作为选项的参数(不需要空格)。用两个破折号(即--n5)启动选项应该产生'n5:true'。对于大多数Unix命令行工具来说,这是相当标准的行为(但不幸的是,不是全部)。 - Menno Smits


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


Vanilla 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:具有参数解析的成熟/交互式命令行应用程序。


204
2018-01-14 05:26



Yargs是一个非常好的人 - ForzaGreen
“$ npm install -g yargs”产生了1.9 MB的JavaScript代码。当argv解析器库需要两兆字节的代码时,这种疯狂何时会结束?增加攻击面,浪费RAM等...... - joonas.fi
Yargs是一个更大的工具,也恰好解析命令行参数。没有疯狂,只是缺乏信息。如果你想要更轻松的东西,请使用原始的JS,Meow或Minimist。 - dthree
nconf丢失了 - Michael
“$ npm i yargs” - > 800 KB这里,我想包裹所有者终于学会了忽略不相关的文件。无论如何,对于愚蠢的项目来说仍然很大,但是当你需要健壮性时很小,而对于较大的项目你已经有了依赖性。 - Andre Figueiredo


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

查看 乐观的图书馆,它比手动解析命令行选项要好得多。

更新

Optimist已被弃用。尝试 yargs 这是乐观主义者的活跃分支。


108
2017-07-04 04:02



+1链接。有很长的命令行选项解析器列表 github.com/joyent/node/wiki/modules#wiki-parsers-commandline - Thilo
这已被弃用。 Yargs是一个乐观主义者的分支。 github.com/chevex/yargs - Nikolay Yordanov
Minimist是现在被弃用的乐观主义者的另一个接班人。它是“乐观主义者的论证解析者的胆量,没有所有幻想的装饰。”上个月有2300万次下载(截至2015年12月)。 - aap


这里有几个很好的答案,但这一切似乎都非常复杂。这与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"

69
2017-12-12 05:19





Commander.js

适用于定义选项,操作和参数。它还会为您生成帮助页面。

及时

如果您喜欢回调方法,那么非常适合从用户那里获取输入。

联合提示

如果您喜欢生成器方法,那么非常适合从用户那里获取输入。


66
2017-09-20 10:20



@Evan Carroll请不要编辑我的答案来推广我不使用的图书馆 stackoverflow.com/posts/7483600/revisions 特别是因为您缺少的功能,应该保存这些意见以征求意见或向模块作者提出请求,而不是编辑其他人的答案。 - balupton
Commander.js真的帮助了我。其他库不能与nexe编译器一起使用,但是这个可以解决问题。如果你想在使用nexe时获得args,请务必将-f传递给nexe编译器。 - pierce.jason
Commander.js Extreamelly容易!!! - aemonge