如何在Node.js脚本中处理命令行参数

来自菜鸟教程
跳转至:导航、​搜索

介绍

命令行参数是一种为命令提供额外输入的方法。 您可以使用命令行参数为您的 Node.js 脚本增加灵活性和自定义。

在本文中,您将了解参数向量、检测参数标志、处理多个参数和值以及使用 commander 包。

先决条件

要完成本教程,您需要:

  • Node.js 的本地开发环境。 关注【X7X】如何安装Node.js并创建本地开发环境【X76X】。

本教程已使用 Node v16.10.0、npm v7.12.2 和 commander v7.2.0 进行了验证。

使用参数向量

Node.js 支持传递参数的列表,称为 参数向量 。 参数向量是一个数组,可从 Node.js 脚本中的 process.argv 获得。

该数组包含传递给脚本的所有内容,包括 Node.js 可执行文件以及脚本的路径和文件名。

如果您要运行以下命令:

node example.js -a -b -c

您的参数向量将包含五个项目:

[
  '/usr/bin/node',
  '/path/to/example.js',
  '-a',
  '-b',
  '-c'
]

至少,不带任何参数运行的脚本仍将包含数组中的两项,即 node 可执行文件和正在运行的脚本文件。

通常,参数向量与 参数计数 (argc) 配对,它告诉您传入了多少参数。 Node.js 缺少这个特定的变量,但我们总是可以获取参数向量数组的 length

例子.js

if (process.argv.length === 2) {
  console.error('Expected at least one argument!');
  process.exit(1);
}

此示例代码将检查 argvlength2 的长度表示只有 node 可执行文件和脚本文件存在。 如果没有参数,它将打印出消息:Expected at least one argument!exit

使用参数标志

让我们考虑一个显示默认消息的示例。 但是,当存在特定标志时,它将显示不同的消息。

例子.js

if (process.argv[2] && process.argv[2] === '-f') {
  console.log('Flag is present.');
} else {
  console.log('Flag is not present.');
}

该脚本检查我们的参数向量中是否有第三项。 索引是 2 因为 JavaScript 中的数组是零索引的。 如果存在第三项并且等于 -f,它将改变输出。

以下是不带参数运行脚本的示例:

node example.js

以及生成的输出:

OutputFlag is not present.

以下是使用参数运行脚本的示例:

node example.js -f

以及生成的输出:

OutputFlag is present.

我们不必局限于修改条件控制结构,我们也可以使用传递给脚本的实际值:

例子.js

const custom = (process.argv[2] || 'Default');
console.log('Custom: ', custom);

此脚本不是基于参数的条件,而是采用传入的值(缺少参数时默认为 "Default")并将其注入脚本输出。

对值使用多个参数

我们已经编写了一个接受参数和一个接受原始值的脚本,在我们想要将值与参数结合使用的场景中呢?

为了让事情更复杂一点,让我们也接受多个参数:

例子.js

// Check to see if the -f argument is present
const flag = (  
  process.argv.indexOf('-f') > -1 ? 'Flag is present.' : 'Flag is not present.'
);

// Checks for --custom and if it has a value
const customIndex = process.argv.indexOf('--custom');
let customValue;

if (customIndex > -1) {
  // Retrieve the value after --custom
  customValue = process.argv[customIndex + 1];
}

const custom = (customValue || 'Default');

console.log('Flag:', `${flag}`);
console.log('Custom:', `${custom}`);

通过使用 indexOf 而不是依赖特定的索引值,我们可以在参数向量中的任何位置查找参数,而不管顺序如何!

以下是不带参数运行脚本的示例:

node example.js

以及生成的输出:

OutputFlag: Flag is not present.
Custom: Default

以下是使用参数运行脚本的示例:

node example.js -f --custom Override

以及生成的输出:

OutputFlag: Flag is present.
Custom: Override

现在,您的命令行脚本可以接受多个参数和值。

使用 commander

当参数输入非常具体时,上述示例有效。 但是,用户可能会尝试使用带或不带等号的参数(-nJaneDoe--name=JohnDoe),带空格的引用字符串(-n "Jane Doe")甚至有参数别名以提供简写和速写版本。

这就是 commander 库可以提供帮助的地方。

commander 是一个流行的 Node.js 库,其灵感来自同名的 Ruby 库。

首先,在您的项目目录中,初始化您的项目:

npm init

然后,安装 commander

npm install commander@7.2.0

让我们以之前的示例为例,将其移植为使用 commander

示例-commander.js

const commander = require('commander');

commander
  .version('1.0.0', '-v, --version')
  .usage('[OPTIONS]...')
  .option('-f, --flag', 'Detects if the flag is present.')
  .option('-c, --custom <value>', 'Overwriting value.', 'Default')
  .parse(process.argv);

const options = commander.opts();

const flag = (options.flag ? 'Flag is present.' : 'Flag is not present.');

console.log('Flag:', `${flag}`);
console.log('Custom:', `${options.custom}`);

commander 通过处理 process.argv 并将参数和任何关联值作为属性添加到我们的 commander 对象中来完成所有艰苦的工作。

我们可以轻松地对脚本进行版本控制,并使用 -v--version 报告版本号。 我们还通过传递 --help 参数获得了一些友好的输出来解释脚本的用法,如果您碰巧传递了未定义的参数或缺少传递的值,它将引发错误。

结论

在本文中,您了解了参数向量、检测参数标志、处理多个参数和值以及使用 commander 包。

虽然您可以使用自己的命令行参数快速创建脚本,但如果您想要更高的健壮性和可维护性,您可能需要考虑使用 commanderInquirer.js