参数
本节课中,学习并练习如何在 Node 中使用参数。
由于你将与命令行界面(CLI)进行交互,因此需要手动传递输入。在 Bash 中,参数按编号传递,并以美元符号($)前缀标识。
注意:由于你不会使用 Bash,因此无需测试 Bash 示例。这些示例仅用于演示目的。
Bash 与 Node 的对比
Bash 示例
在尝试用 Node 实现之前,先看看在 Bash 中会是什么样子。在此示例中,你将运行一个 Bash 脚本,并传入一个名字作为参数。由于这是第一个参数,可以在脚本中通过 $1 访问它。
1$ bash my-bash-script.sh 'Fred Flintstone' 2... 正在运行脚本
my-bash-script.sh 的内容如下:
1name="$1" 2# name 现在是 - 'Fred Flintstone'
Node 示例
在 Node 中无法像 Bash 那样方便地处理参数。你可以使用一个内置对象 process,它包含与脚本运行过程相关的所有信息。目前,你应该关注如何获取传入的参数。
通过 Node 运行以下操作,可以观察到结果。假设你有一个名为 my-node-script.js 的脚本:
1node my-node-script.js 'Fred Flintstone'
当你运行上述命令时,实际上启动了一个新的 process。那么这个 process 对象里有什么?它包含一个名为 argv 的数组。
my-node-script.js 的内容如下:
1const args = process.argv; 2/* 3args 数组现在是 4[ 5 '/usr/local/bin/node', 6 '/usr/src/app/my-node-script.js', 7 'Fred Flintstone' 8] 9*/
如上所示,数组中有三个元素。第一个是 Node 可执行文件的完整路径,第二个是你要执行的脚本的完整路径,第三个是你从 CLI 传入的第一个参数。一个常见的误解是认为传入的第一个参数 Fred Flintstone 是数组的第一个元素。请记住,你的参数从 process 数组的第三个索引开始。通常情况下,不需要前两个元素,因此应将其移除。
1const args = process.argv.slice(2); 2/* 3args 现在是 4[ 5 'Fred Flintstone' 6] 7*/
现在,你已移除了不需要的数组元素,剩下的就是传给脚本的实际参数。
以下是上述内容的简单说明图示。
一个处理参数的 Node.js 脚本
下面是一个简单的 Node.js 脚本,用于接收并处理传入的用户名参数。
1const args = process.argv.slice(2); 2const [name] = args; 3 4if (name === undefined) { 5 console.error('请传入一个名字,例如:node hello.js Shaun'); 6 process.exit(0); 7} 8 9console.log(`你好,${name}`);
如前所述,你从 process 数组中移除了两个不需要的元素。使用 ES6 语法,你可以提取第一个元素并赋值给一个名为 name 的常量。这等价于:
1const name = args[0];
if 语句确保用户已传入参数。如果 name 为 undefined,说明用户调用脚本时未提供任何参数。
在这种情况下,你将通过调用 process 对象的 exit 方法退出脚本。这意味着脚本不会执行到最后的 console.log() 输出“你好,${name}”。相反,它会打印以下内容并终止脚本。
1请传入一个名字,例如:node hello.js 'Shaun'
使用 Node.js 运行程序
运行 Node.js 程序的常规方式是使用全局可用的 node 命令,并传入要执行的文件名。
如果你的主 Node.js 应用文件是 app.js,你可以在终端中输入以下命令来运行它:
1node app.js
编码示例
通过传入参数运行 hello.js 脚本,使用以下命令在终端中执行,点击 运行 按钮后将显示如下内容:
1node hello.js 'Shaun'
No configuration found for ID: c23b4fee72dca4c6f87eb686e36f135a2d36df743149fc88274bacc93b2481ab
总结
你创建了第一个 Node.js 脚本,它接收用户姓名作为参数,并在命令行界面中输出该姓名。
你可以使用 node filename.js 这种格式的原因是:一旦安装了 Node,你的操作系统就会拥有一个名为 node 的全局可执行文件。因此,你可以在命令行的任意位置调用它。包含脚本的 JavaScript 文件 hello.js 会被传递给 Node 可执行文件,同时传入字符串 Shaun。该字符串被视为参数,并被放入 process.argv 数组中。脚本随后利用该字符串,以名字形式向用户打招呼。
现在,通过一个小测验来检验你对 Node.js 到目前为止的理解。
Quiz
process.argv 是一个数组。