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

介绍

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

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

先决条件

要完成本教程,您需要:

本教程已通过 Node v16.10.0、npmv7.12.2 和commanderv7.2.0 验证。

使用参数向量

Node.js 支持传递参数的列表,称为参数向量参数向量是process.argvNode.js 脚本中可用的数组

该数组包含传递给脚本的所有内容,包括 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);
}

这个例子的代码将检查lengthargv长度2表示仅存在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

以及生成的输出:

Output
Flag is not present.

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

  • node example.js -f

以及生成的输出:

Output
Flag 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

以及生成的输出:

Output
Flag: Flag is not present. Custom: Default

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

  • node example.js -f --custom Override

以及生成的输出:

Output
Flag: 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包。

虽然您可以使用自己的命令行参数快速创建脚本,但您可能需要考虑使用commander或者Inquirer.js是否需要更高的健壮性和可维护性。

觉得文章有用?

点个广告表达一下你的爱意吧 !😁