如何在Node.js中编写和运行你的第一个程序
作为 Write for DOnations 计划的一部分,作者选择了 Open Internet/Free Speech Fund 来接受捐赠。
介绍
Node.js 是一个流行的开源运行时环境,它可以使用 V8 JavaScript 引擎在浏览器之外执行 JavaScript,这与用于驱动 Google 的引擎相同Chrome 网络浏览器 的 JavaScript 执行。 Node 运行时通常用于创建命令行工具和 Web 服务器。
学习 Node.js 将允许您使用相同的语言编写前端代码和后端代码。 在整个堆栈中使用 JavaScript 可以帮助减少上下文切换的时间,并且库更容易在后端服务器和前端项目之间共享。
此外,由于对 异步执行 的支持,Node.js 在 I/O 密集型任务方面表现出色,这就是它非常适合 Web 的原因。 使用 Node.js 编写的实时应用程序(如视频流或持续发送和接收数据的应用程序)可以更高效地运行。
在本教程中,您将使用 Node.js 运行时创建您的第一个程序。 您将了解一些特定于 Node 的概念,并逐步创建一个程序,帮助用户检查其系统上的环境变量。 为此,您将学习如何将字符串输出到控制台、接收来自用户的输入以及访问环境变量。
先决条件
要完成本教程,您需要:
- Node.js 安装在您的开发机器上。 本教程使用 Node.js 版本 10.16.0。 要在 macOS 或 Ubuntu 18.04 上安装它,请按照 如何在 macOS 上安装 Node.js 和创建本地开发环境中的步骤或 如何安装节点的“使用 PPA 安装”部分中的步骤进行操作.js 在 Ubuntu 18.04 上。
- JavaScript 的基本知识,您可以在此处找到:如何在 JavaScript 中编码。
如果您想在不使用服务器或本地计算机的情况下试验 Node.js,您可以在浏览器中使用交互式终端。 单击下面的启动交互式终端!按钮开始使用。
启动交互式终端!
第 1 步 — 输出到控制台
写一个“你好,世界!” 程序,打开命令行文本编辑器,例如 nano
并创建一个新文件:
nano hello.js
打开文本编辑器后,输入以下代码:
你好.js
console.log("Hello World");
Node.js 中的 console
对象提供了简单的方法来写入 stdout
、stderr
或任何其他 Node.js 流,在大多数情况下是命令行。 log
方法打印到 stdout
流,因此您可以在控制台中看到它。
在 Node.js 的上下文中,streams 是可以接收数据的对象,例如 stdout
流,或者可以输出数据的对象,例如网络套接字或文件。 对于 stdout
和 stderr
流,发送给它们的任何数据都将显示在控制台中。 流的一大优点是它们很容易重定向,例如,在这种情况下,您可以将程序的输出重定向到文件。
按CTRL+X
保存并退出nano
,当提示保存文件时,按Y
。 现在您的程序已准备好运行。
第 2 步 — 运行程序
要运行此程序,请使用 node
命令,如下所示:
node hello.js
hello.js
程序将执行并显示以下输出:
OutputHello World
Node.js 解释器通过调用全局 console
对象的 log
方法读取文件并执行 console.log("Hello World");
。 string "Hello World"
作为参数传递给 log
函数。
尽管代码中需要引号来指示文本是字符串,但它们不会打印到屏幕上。
确认程序有效后,让我们让它更具交互性。
第三步——通过命令行参数接收用户输入
每次运行 Node.js 时,“Hello,World!” 程序,它产生相同的输出。 为了使程序更具动态性,让我们从用户那里获取输入并将其显示在屏幕上。
命令行工具通常接受修改其行为的各种参数。 例如,使用 --version
参数运行 node
会打印安装的版本,而不是运行解释器。 在这一步中,您将使您的代码通过命令行参数接受用户输入。
用 nano 创建一个新文件 arguments.js
:
nano arguments.js
输入以下代码:
参数.js
console.log(process.argv);
process
对象是一个 global Node.js 对象,其中包含 函数 和所有与当前运行的 Node.js 进程相关的数据。 argv
属性是一个 array 字符串,其中包含提供给程序的所有命令行参数。
通过输入CTRL+X
保存并退出nano
,当提示保存文件时,按Y
。
现在,当你运行这个程序时,你提供了一个这样的命令行参数:
node arguments.js hello world
输出如下所示:
Output[ '/usr/bin/node', '/home/sammy/first-program/arguments.js', 'hello', 'world' ]
process.argv
数组中的第一个参数始终是运行程序的 Node.js 二进制文件的位置。 第二个参数始终是正在运行的文件的位置。 其余参数是用户输入的内容,在本例中为:hello
和 world
。
我们最感兴趣的是用户输入的参数,而不是 Node.js 提供的默认参数。 打开arguments.js
文件进行编辑:
nano arguments.js
将 console.log(process.arg);
更改为以下内容:
参数.js
console.log(process.argv.slice(2));
因为 argv
是一个数组,您可以使用 JavaScript 的内置 slice 方法 返回元素的选择。 当您提供以 2
作为参数的 slice
函数时,您将获得 argv
的所有元素,这些元素在 之后 的第二个元素; 即用户输入的参数。
使用 node
命令和与上次相同的参数重新运行程序:
node arguments.js hello world
现在,输出如下所示:
Output[ 'hello', 'world' ]
现在您可以从用户那里收集输入,让我们从程序的环境中收集输入。
第 4 步 — 访问环境变量
环境变量是存储在程序外部并由操作系统提供的键值数据。 它们通常由系统或用户设置,并且可供所有正在运行的进程用于配置或状态目的。 您可以使用 Node 的 process
对象来访问它们。
使用 nano
创建一个新文件 environment.js
:
nano environment.js
添加以下代码:
环境.js
console.log(process.env);
env
对象存储 all Node.js 运行程序时可用的环境变量。
像以前一样保存并退出,然后使用 node
命令运行 environment.js
文件。
node environment.js
运行程序后,您应该会看到类似于以下内容的输出:
Output{ SHELL: '/bin/bash', SESSION_MANAGER: 'local/digitalocean:@/tmp/.ICE-unix/1003,unix/digitalocean:/tmp/.ICE-unix/1003', COLORTERM: 'truecolor', SSH_AUTH_SOCK: '/run/user/1000/keyring/ssh', XMODIFIERS: '@im=ibus', DESKTOP_SESSION: 'ubuntu', SSH_AGENT_PID: '1150', PWD: '/home/sammy/first-program', LOGNAME: 'sammy', GPG_AGENT_INFO: '/run/user/1000/gnupg/S.gpg-agent:0:1', GJS_DEBUG_TOPICS: 'JS ERROR;JS LOG', WINDOWPATH: '2', HOME: '/home/sammy', USERNAME: 'sammy', IM_CONFIG_PHASE: '2', LANG: 'en_US.UTF-8', VTE_VERSION: '5601', CLUTTER_IM_MODULE: 'xim', GJS_DEBUG_OUTPUT: 'stderr', LESSCLOSE: '/usr/bin/lesspipe %s %s', TERM: 'xterm-256color', LESSOPEN: '| /usr/bin/lesspipe %s', USER: 'sammy', DISPLAY: ':0', SHLVL: '1', PATH: '/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin', DBUS_SESSION_BUS_ADDRESS: 'unix:path=/run/user/1000/bus', _: '/usr/bin/node', OLDPWD: '/home/sammy' }
请记住,您看到的许多环境变量取决于系统的配置和设置,并且您的输出看起来可能与您在此处看到的大不相同。 与其查看一长串环境变量,您可能想要检索一个特定的环境变量。
第 5 步 — 访问指定的环境变量
在此步骤中,您将使用全局 process.env
对象查看环境变量及其值,并将它们的值打印到控制台。
process.env
对象是环境变量名称与其存储为字符串的值之间的简单映射。 像 JavaScript 中的所有 对象一样,您可以通过在方括号中引用其名称来访问单个属性。
打开environment.js
文件进行编辑:
nano environment.js
将 console.log(process.env);
更改为:
环境.js
console.log(process.env["HOME"]);
保存文件并退出。 现在运行 environment.js
程序:
node environment.js
输出现在如下所示:
Output/home/sammy
您现在只打印 process.env
的 HOME
属性,而不是打印整个对象,该属性存储 $HOME
环境变量的值。
同样,请记住,此代码的输出可能与您在此处看到的不同,因为它特定于您的系统。 现在您可以指定要检索的环境变量,您可以通过询问用户他们想要查看的变量来增强您的程序。
第 6 步 — 检索响应用户输入的参数
接下来,您将使用读取命令行参数和环境变量的能力来创建一个命令行实用程序,该实用程序将环境变量的值打印到屏幕上。
使用 nano
创建一个新文件 echo.js
:
nano echo.js
添加以下代码:
回声.js
const args = process.argv.slice(2); console.log(process.env[args[0]]);
echo.js
的第一行将用户提供的所有命令行参数存储到一个名为 args
的常量变量中。 第二行打印存储在 args
的第一个元素中的环境变量; 即用户提供的第一个命令行参数。
保存退出nano
,然后运行程序如下:
node echo.js HOME
现在,输出将是:
Output/home/sammy
参数 HOME
被保存到 args
数组,然后用于通过 process.env
对象在环境中查找其值。
此时,您现在可以访问系统上任何环境变量的值。 要验证这一点,请尝试查看以下变量:PWD
、USER
、PATH
。
检索单个变量很好,但让用户指定他们想要多少个变量会更好。
第 7 步 — 查看多个环境变量
目前,应用程序一次只能检查一个环境变量。 如果我们可以接受多个命令行参数并在环境中获取它们对应的值,那将会很有用。 使用 nano
编辑 echo.js
:
nano echo.js
编辑该文件,使其具有以下代码:
回声.js
const args = process.argv.slice(2); args.forEach(arg => { console.log(process.env[arg]); });
forEach 方法 是所有数组对象的标准 JavaScript 方法。 它接受一个 回调函数 用于迭代数组的每个元素。 您在 args
数组上使用 forEach
,为它提供一个回调函数,用于在环境中打印当前参数的值。
保存并退出文件。 现在用两个参数重新运行程序:
node echo.js HOME PWD
您将看到以下输出:
[secondary_label Output] /home/sammy /home/sammy/first-program
forEach
函数确保打印 args
数组中的每个命令行参数。
现在您有一种方法可以检索用户要求的变量,但我们仍然需要处理用户输入错误数据的情况。
第 8 步 - 处理未定义的输入
要查看如果您给程序一个不是有效环境变量的参数会发生什么,请运行以下命令:
node echo.js HOME PWD NOT_DEFINED
输出将类似于以下内容:
[secondary_label Output] /home/sammy /home/sammy/first-program undefined
前两行按预期打印,最后一行只有 undefined
。 在 JavaScript 中,undefined
值表示尚未为变量或属性赋值。 因为 NOT_DEFINED
不是有效的环境变量,所以显示为 undefined
。
如果在环境中找不到他们的命令行参数,那么用户看到错误消息会更有帮助。
打开echo.js
进行编辑:
nano echo.js
编辑 echo.js
使其具有以下代码:
回声.js
const args = process.argv.slice(2); args.forEach(arg => { let envVar = process.env[arg]; if (envVar === undefined) { console.error(`Could not find "${arg}" in environment`); } else { console.log(envVar); } });
在这里,您已经修改了提供给 forEach
的回调函数来执行以下操作:
- 在环境中获取命令行参数的值并将其存储在变量
envVar
中。 - 检查
envVar
的值是否为undefined
。 - 如果
envVar
是undefined
,那么我们会打印一条有用的消息,指示找不到它。 - 如果找到环境变量,我们打印它的值。
注:console.error
函数通过stderr
流向屏幕打印消息,而console.log
通过stdout
流向屏幕打印] 溪流。 当您通过命令行运行此程序时,您不会注意到 stdout
和 stderr
流之间的区别,但是通过 stderr
打印错误是一个好习惯流,以便其他程序更容易识别和处理它们,可以区分。
现在再次运行以下命令:
node echo.js HOME PWD NOT_DEFINED
这次输出将是:
[secondary_label Output] /home/sammy /home/sammy/first-program Could not find "NOT_DEFINED" in environment
现在,当您提供不是环境变量的命令行参数时,您会收到一条明确的错误消息,说明这一点。
结论
您的第一个程序在屏幕上显示“Hello World”,现在您已经编写了一个读取用户参数以显示环境变量的 Node.js 命令行实用程序。
如果你想更进一步,你可以更多地改变这个程序的行为。 例如,您可能希望在打印之前验证命令行参数。 如果参数未定义,则可以返回错误,并且只有当所有参数都是有效的环境变量时,用户才会得到输出。
如果您想继续学习 Node.js,您可以返回 如何在 Node.js 中编写代码系列,或者在我们的 Node 主题页面 上浏览编程项目和设置。