如何用 Node.js 编写和运行您的第一个程序

作者选择了 开放式互联网 / 自由言论基金作为 写给捐赠计划的一部分接受捐款。

介绍

Node.js是一个流行的开源运行环境,可以使用V8JavaScript引擎在浏览器外执行JavaScript(https://www.digitalocean.com/community/tutorial_series/how-to-code-in-javascript),这是用于支持Google ChromeWeb浏览器(https://www.google.com/chrome/)的JavaScript执行的相同引擎。

学习 Node.js 将允许您用同一语言编写前端代码和后端代码. 在整个堆栈中使用 JavaScript 可以帮助缩短语境切换的时间,并且在后端服务器和前端项目之间更容易共享库。

此外,由于它支持 非同步执行,Node.js 在I/O密集任务中表现出色,这使得它非常适合Web。

在本教程中,您将使用 Node.js 运行时间创建您的第一个程序. 您将被介绍到几个 Node 特定的概念,并建立您的方式,以创建一个帮助用户检查系统上的环境变量的程序。

前提条件

要完成本教程,您将需要:

此教程使用 Node.js 版本 10.16.0. 要在 macOS 或 Ubuntu 18.04 上安装此功能,请遵循 如何在 macOS 上安装 Node.js 并创建本地开发环境如何在 Ubuntu 18.04 上安装 Node.js使用 PPA 安装部分的步骤。

步骤 1 – 输出到控制台

要写一个Hello, World!程序,打开一个命令行文本编辑器,如nano,并创建一个新的文件:

1nano hello.js

打开文本编辑器时,输入以下代码:

1[label hello.js]
2console.log("Hello World");

Node.js中的控制台对象提供了简单的方法来写到stdoutstderr或任何其他 Node.js 流,这在大多数情况下是命令行。

在 Node.js 背景下, streams 是可以接收数据的对象,如stdout流,或可以输出数据的对象,如网络接口或文件.在stdoutstderr流的情况下,任何发送给它们的数据将在控制台中显示。

保存和退出nanoCTRL+X,当被要求保存文件时,按Y

步骤2 - 运行程序

要运行此程序,请使用node命令如下:

1node hello.js

hello.js程序将执行并显示以下输出:

1[secondary_label Output]
2Hello World

Node.js 解释器读取了文件并执行了console.log(Hello World);通过调用全球console对象的log`方法。

虽然引用符号在代码中是必要的,以表示文本是一个字符串,但它们不会打印到屏幕上。

确认该程序是有效的,让我们让它更互动。

步骤 3 – 通过命令行参数接收用户输入

每次你运行 Node.js Hello, World! 程序,它会产生相同的输出. 为了使程序更加动态,让我们从用户那里获取输入并显示在屏幕上。

命令行工具通常会接受改变其行为的各种参数,例如,运行节点--版本参数打印了安装的版本,而不是运行解释器。

使用 nano 创建一个新的文件 arguments.js:

1nano arguments.js

输入以下代码:

1[label arguments.js]
2console.log(process.argv);

进程对象是一个 global Node.js 对象,它包含 函数和与当前正在运行的 Node.js 进程相关的所有数据。

通过键入CTRL+X来保存和退出nano,当被要求保存文件时,按Y

现在,当您运行此程序时,您会提供这样的命令行参数:

1node arguments.js hello world

结果看起来如下:

1[secondary_label Output]
2[ '/usr/bin/node',
3  '/home/sammy/first-program/arguments.js',
4  'hello',
5  'world' ]

process.argv数组中的第一个参数总是运行该程序的 Node.js 二进制的位置,第二个参数总是运行的文件的位置,其余参数是用户输入的位置,在这种情况下:你好世界

我们主要感兴趣的是用户输入的论点,而不是 Node.js 提供的默认论点。

1nano arguments.js

將「console.log(process.arg)」變更為下列:

1[label arguments.js]
2console.log(process.argv.slice(2));

由于argv是一个数组,所以你可以使用JavaScript的内置的slic方法(LINK0)返回一个元素的选择。当你将slic函数提供2作为它的参数时,你会得到argv的所有元素,其第二个元素之后的元素,即用户输入的参数。

重启程序,使用节点命令和与上次相同的参数:

1node arguments.js hello world

现在,输出看起来像这样:

1[secondary_label Output]
2[ 'hello', 'world' ]

现在你可以从用户收集输入,让我们从程序的环境收集输入。

步骤 4 – 访问环境变量

Environment variables 是程序外存储并由操作系统提供的关键值数据,通常由系统或用户设置,并可用于配置或状态的所有运行过程。

使用nano创建一个新的文件environment.js:

1nano environment.js

添加以下代码:

1[label environment.js]
2console.log(process.env);

env 对象存储在 Node.js 运行程序时可用的所有环境变量。

像以前一样保存和退出,并使用节点命令运行environment.js文件。

1node environment.js

在运行该程序时,您应该看到类似于以下的输出:

 1[secondary_label Output]
 2{ SHELL: '/bin/bash',
 3  SESSION_MANAGER:
 4   'local/digitalocean:@/tmp/.ICE-unix/1003,unix/digitalocean:/tmp/.ICE-unix/1003',
 5  COLORTERM: 'truecolor',
 6  SSH_AUTH_SOCK: '/run/user/1000/keyring/ssh',
 7  XMODIFIERS: '@im=ibus',
 8  DESKTOP_SESSION: 'ubuntu',
 9  SSH_AGENT_PID: '1150',
10  PWD: '/home/sammy/first-program',
11  LOGNAME: 'sammy',
12  GPG_AGENT_INFO: '/run/user/1000/gnupg/S.gpg-agent:0:1',
13  GJS_DEBUG_TOPICS: 'JS ERROR;JS LOG',
14  WINDOWPATH: '2',
15  HOME: '/home/sammy',
16  USERNAME: 'sammy',
17  IM_CONFIG_PHASE: '2',
18  LANG: 'en_US.UTF-8',
19  VTE_VERSION: '5601',
20  CLUTTER_IM_MODULE: 'xim',
21  GJS_DEBUG_OUTPUT: 'stderr',
22  LESSCLOSE: '/usr/bin/lesspipe %s %s',
23  TERM: 'xterm-256color',
24  LESSOPEN: '| /usr/bin/lesspipe %s',
25  USER: 'sammy',
26  DISPLAY: ':0',
27  SHLVL: '1',
28  PATH:
29   '/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin',
30  DBUS_SESSION_BUS_ADDRESS: 'unix:path=/run/user/1000/bus',
31  _: '/usr/bin/node',
32  OLDPWD: '/home/sammy' }

请记住,您看到的许多环境变量取决于您的系统的配置和设置,并且您的输出可能与您在这里看到的内容显著不同。

步骤 5 – 访问指定的环境变量

在此步骤中,您将使用全球 process.env 对象查看环境变量及其值,并将其值打印到控制台。

「process.env」对象是一个简单的环境变量名称和其存储为字符串的值之间的映射。像所有(JavaScript 中的对象)一样(https://andsky.com/tech/tutorials/understanding-objects-in-javascript),你可以通过将其名称引用到一个单独的属性。

打开environment.js文件来编辑:

1nano environment.js

將「console.log(process.env)」變更為:

1[label environment.js]
2console.log(process.env["HOME"]);

保存文件并退出,现在运行environment.js程序:

1node environment.js

现在的产量看起来是这样的:

1[secondary_label Output]
2/home/sammy

现在,而不是打印整个对象,您只打印了process.envHOME属性,该属性存储了$HOME环境变量的值。

再次,请记住,这个代码的输出可能会与你在这里看到的不同,因为它是特定于你的系统. 现在你可以指定要检索的环境变量,你可以通过询问用户想要看到的变量来增强你的程序。

步骤 6 – 回复用户输入时获取一个论点

接下来,您将使用读取命令行参数和环境变量的能力创建命令行实用程序,将环境变量的值打印到屏幕上。

使用nano创建一个新的文件echo.js:

1nano echo.js

添加以下代码:

1[label echo.js]
2const args = process.argv.slice(2);
3console.log(process.env[args[0]]);

echo.js的第一行存储了用户提供的所有命令行参数到一个称为args的恒定变量中,第二行打印了存储在args的第一个元素中的环境变量,即用户提供的第一个命令行参数。

保存和退出nano,然后运行程序如下:

1node echo.js HOME

现在,产量将是:

1[secondary_label Output]
2/home/sammy

HOME参数被保存到args数组中,然后通过process.env对象在环境中找到其值。

在此时刻,您现在可以访问系统上的任何环境变量的值. 要验证这一点,请尝试查看以下变量: PWD, USER, PATH

检索单个变量是好的,但让用户指定他们想要多少个变量会更好。

步骤7:查看多个环境变量

目前,该应用程序只能一次检查一个环境变量,如果我们能够接受多个命令行参数并在环境中获得相应的值,这将是有用的。

1nano echo.js

编辑文件,以便它有以下代码:

1[label echo.js]
2const args = process.argv.slice(2);
3
4args.forEach(arg => {
5  console.log(process.env[arg]);
6});

[forEach 方法](https://andsky.com/tech/tutorials/how-to-use-array-methods-in-javascript-iteration-methods#foreach()是所有数组对象的标准 JavaScript 方法. 它接受一个 _callback 函数,因为它在数组的每个元素上迭代而使用。

保存和退出文件. 现在用两个参数重新运行程序:

1node echo.js HOME PWD

你会看到以下结果:

1[secondary_label Output] 
2/home/sammy
3/home/sammy/first-program

forEach函数确保在args数组中的每个命令行参数被打印。

现在你有一个方法来检索用户要求的变量,但我们仍然需要处理用户输入错误数据的情况。

第8步:处理未定义输入

若要查看如果您给程序一个不是有效的环境变量的参数会发生什么,请执行以下操作:

1node echo.js HOME PWD NOT_DEFINED

结果将类似于以下:

1[secondary_label Output] 
2/home/sammy
3/home/sammy/first-program
4undefined

第一两个行按预期打印,最后一行只有未定义值。在JavaScript中,未定义值意味着变量或属性没有被分配一个值。

对于用户来说,如果他们的命令行参数未在环境中找到,则会看到错误消息更有用。

打开echo.js来编辑:

1nano echo.js

编辑echo.js,使其具有以下代码:

 1[label echo.js]
 2const args = process.argv.slice(2);
 3
 4args.forEach(arg => {
 5  let envVar = process.env[arg];
 6  if (envVar === undefined) {
 7    console.error(`Could not find "${arg}" in environment`);
 8  } else {
 9    console.log(envVar);
10  }
11});

在这里,您已经修改了为forEach提供的回调函数,以执行以下操作:

  1. 在环境中获取命令行参数的值,并将其存储在变量 envVar
  2. 检查 envVar 的值是否是 未定义
  3. 如果 envVar未定义,我们会打印一个有用的信息,表示它无法找到
  4. 如果发现了环境变量,我们会打印它的值

<$>[note] **注:console.error函数通过stderr流将消息打印到屏幕,而console.log则通过stdout流打印到屏幕。当您通过命令行运行此程序时,您不会注意到stdoutstderr流之间的差异,但通过stderr流打印错误是很好的做法,以便其他程序更容易识别和处理它们,这可以说明差异。

现在再执行以下命令:

1node echo.js HOME PWD NOT_DEFINED

这一次,产量将是:

1[secondary_label Output] 
2/home/sammy
3/home/sammy/first-program
4Could not find "NOT_DEFINED" in environment

现在,当您提供不是环境变量的命令行参数时,您会收到一个明确的错误消息。

结论

你的第一个程序在屏幕上显示了Hello World,现在你写了一个Node.js命令行实用程序,该实用程序读取用户参数以显示环境变量。

例如,您可能想在打印之前验证命令行参数. 如果参数未定义,您可以返回错误,并且用户只会得到输出,如果所有参数都是有效的环境变量。

如果您想继续学习 Node.js,您可以返回 如何在 Node.js 系列中编码,或浏览我们的 Node 主题页面上的编程项目和设置。

Published At
Categories with 技术
comments powered by Disqus