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

问:

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

$ node server.js folder

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

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

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

答1:

保持自己快人一步,享受全网独家提供的一站式外包任务、远程工作、创意产品订阅服务–huntsbot.com

标准方法(无库)

参数存储在 process.argv

这里是the node docs on handling command line args:

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] 或 node debug script.js [arguments]。例如: node --harmony script.js balala 或 node --no-deprecation --enable-ssl2 script.js balala ,我们可以将 process.execArgv 与 process.argv 一起使用

答2:

huntsbot.com精选全球7大洲远程工作机会,涵盖各领域,帮助想要远程工作的数字游民们能更精准、更高效的找到对方。

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

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

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

请注意,我在 4 年前写了这个答案,而我正在运行的代码今天仍然可以 100% 运行。仍然与最新版本的节点保持同步,并且仍然是零问题:这只是一个简单的 shell 脚本。不是一个充满 JS 库的大型全局对象的一部分。我今天仍然支持我的答案。我将在 4 年后再次更新。

已经6年多了。任何更新?

@Nuno 我刚刚在 Node v16.13.2 (2022-01-11) 上测试了我的原始答案,是的,它在发布 11 年后仍然可以正常工作。 :)

让我们在接下来的五年里看到 process.argv 的工作;)

答3:

huntsbot.com – 高效赚钱,自由工作

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

实际上,这个解决方案对于开发具有更多标志和参数的命令行工具更有帮助,并且应该更多地支持恕我直言。

如果您要使用此答案,请考虑使用更活跃的分叉 minimist-lite,因为前者已被放弃。 “最新的正确答案”将使用 process.argv.slice(2) 这是实际问题的答案......

答4:

huntsbot.com汇聚了国内外优秀的初创产品创意,可按收入、分类等筛选,希望这些产品与实践经验能给您带来灵感。

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

香草 javascript 参数解析:

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

这将返回:

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

Official docs

最常用于参数解析的 NPM 包:

Minimist:用于最少的参数解析。

Commander.js:最常用的参数解析模块。

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

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

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

“$ npm install -g yargs”产生了 1.9 MB 的 JavaScript 代码。当一个 argv 解析器库需要两兆字节的代码时,这种疯狂何时结束?增加攻击面,浪费内存等...

选择自定义 arg 的简单方法: const list_arg = process.argv.filter((arg) => (['-list', '-l'].includes(arg))).toString();

答5:

huntsbot.com提供全网独家一站式外包任务、远程工作、创意产品分享与订阅服务!

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

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

更新

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

+1 链接。 github.com/joyent/node/wiki/modules#wiki-parsers-commandline 上有很长的命令行选项解析器列表

答6:

huntsbot.com聚合了超过10+全球外包任务平台的外包需求,寻找外包任务与机会变的简单与高效。

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

答7:

huntsbot.com精选全球7大洲远程工作机会,涵盖各领域,帮助想要远程工作的数字游民们能更精准、更高效的找到对方。

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

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

.slice(2, process.argv.length) 第二个参数不是多余的吗? .slice() 默认转到字符串的末尾。

答8:

huntsbot.com提供全网独家一站式外包任务、远程工作、创意产品分享与订阅服务!

指挥官.js

非常适合定义您的选项、操作和参数。它还为您生成帮助页面。

及时

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

共同提示

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

@Evan Carroll 请不要编辑我的答案来推广我不使用 stackoverflow.com/posts/7483600/revisions 的库,特别是因为您所追求的功能缺失,此类意见应保存以供评论或向模块作者提出请求,而不是编辑对别人的回答。

答9:

huntsbot.com汇聚了国内外优秀的初创产品创意,可按收入、分类等筛选,希望这些产品与实践经验能给您带来灵感。

标准库

在 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  -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  ] [--kaka] [--ooo] [--map]
  -c, --check     What this option means (mandatory)
  -k, --kaka                  (mandatory)
  --map                       Another description
  -o, --ooo

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

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

npm install stdio

奇怪的是,我设置了 required: false 的参数得到了 requires 1 arguments。我什至用库的第 2 版尝试过这个。

答10:

HuntsBot周刊–不定时分享成功产品案例,学习他们如何成功建立自己的副业–huntsbot.com

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

答11:

huntsbot.com提供全网独家一站式外包任务、远程工作、创意产品分享与订阅服务!

command-line-args值得一看!

您可以使用主要符号标准 (learn more) 设置选项。这些命令都是等效的,设置相同的值:

$ 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

要访问这些值,首先创建一个 option definitions 列表来描述您的应用程序接受的选项。 type 属性是一个 setter 函数(提供的值通过 this 传递),让您可以完全控制接收到的值。

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
}

高级用法

除了上述典型用法,您还可以配置 command-line-args 以接受更高级的语法形式。

Command-based syntax(git 风格)的形式:

$ executable  [options]

例如。

$ git commit --squash -m "This is my commit message"

Command and sub-command syntax(泊坞窗样式)的形式:

$ executable  [options]  [options]

例如。

$ docker run --detached --image centos bash -c yum install -y httpd

使用指南生成

可以使用 command-line-usage 生成使用指南(通常在设置 --help 时打印)。有关如何创建它们的说明,请参阅下面的示例和 read the documentation。

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

https://raw.githubusercontent.com/75lb/command-line-usage/master/example/screens/footer.png

polymer-cli 使用指南是一个很好的真实示例。

https://raw.githubusercontent.com/75lb/command-line-usage/master/example/screens/polymer.png

延伸阅读

还有很多要学习的内容,请参阅 the wiki 以获取示例和文档。

原文链接:https://www.huntsbot.com/qa/5D10/how-do-i-pass-command-line-arguments-to-a-node-js-program?lang=zh_CN&from=csdn

huntsbot.com提供全网独家一站式外包任务、远程工作、创意产品分享与订阅服务!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值