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

IT技术 javascript node.js arguments command-line-arguments
2021-02-04 16:24:12

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

$ node server.js folder

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

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

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

6个回答

标准方法(无库)

参数存储在 process.argv

以下是有关处理命令行参数的节点文档:

process.argv是一个包含命令行参数的数组。第一个元素将是“节点”,第二个元素将是 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
第二个元素 (process.argv[1]) 可能是也可能不是 js 文件。节点命令语法是node [options] [ -e script | script.js ] [arguments]or node debug script.js [arguments]例如:node --harmony script.js balala或者node --no-deprecation --enable-ssl2 script.js balala,我们可以使用process.execArgvprocess.argv
2021-03-12 16:24:12

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

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

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

请注意,我 4 年前写了这个答案,我正在运行的代码今天仍然 100% 正常运行。仍然与最新版本的 node 保持同步并且仍然为零问题:这只是一个简单的 shell 脚本家伙。不是一个充满 JS 库的大型全局对象的一部分。我今天仍然支持我的答案。我将在 4 年后再次更新。
2021-03-15 16:24:12
已经6年多了。任何更新?
2021-04-02 16:24:12

最新的正确答案是使用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' }
实际上,这个解决方案对于开发具有更多标志和参数的命令行工具更有帮助,并且应该被更多地支持。
2021-03-17 16:24:12

基于当前野外趋势的 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:最常用于参数解析的module。

Meow:Commander.js 的轻量级替代品

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

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

选择自定义参数的简单方法: const list_arg = process.argv.filter((arg) => (['-list', '-l'].includes(arg))).toString();
2021-03-15 16:24:12
“$ npm install -g yargs”产生了 1.9 MB 的 JavaScript 代码。当 argv 解析器库需要两兆字节的代码时,这种疯狂何时才能结束?增加的攻击面,浪费的内存等...
2021-04-07 16:24:12

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

查看optimist library,它比手动解析命令行选项要好得多。

更新

乐观主义者已被弃用。试试yargs,它是乐观主义者的活跃分支。

+1 为链接。github.com/joyent/node/wiki/modules#wiki-parsers-commandline有很长的命令行选项解析器列表
2021-03-24 16:24:12