如何在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); }
此示例代码将检查 argv
的 length
。 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
以及生成的输出:
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
包。
虽然您可以使用自己的命令行参数快速创建脚本,但如果您想要更高的健壮性和可维护性,您可能需要考虑使用 commander
或 Inquirer.js。