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

Node.js是一个流行的开源运行时环境,可以使用V8 JavaScript引擎在浏览器外部执行JavaScript,该引擎与用于支持Google Chrome Web浏览器JavaScript执行的引擎相同。在本教程中,您将使用Node.js运行时创建第一个程序。您将了解一些特定于Node的概念,并构建一个程序,帮助用户检查其系统上的环境变量。

作者选择了开放互联网/言论自由基金作为Write for DOnations计划的一部分进行捐赠。

介绍

Node.js是一个流行的开源运行时环境,可以使用V8 JavaScript引擎在浏览器外部执行JavaScript,该引擎与用于支持Google Chrome Web浏览器JavaScript执行的引擎相同。 Node运行时通常用于创建命令行工具和Web服务器。

学习Node.js将允许您使用相同的语言编写前端代码和后端代码。 在整个中使用JavaScript有助于缩短上下文切换的时间,并且可以在后端服务器和前端项目之间更轻松地共享库。

此外,由于支持异步执行,Node.js擅长I / O密集型任务,这使得它非常适合Web。 实时应用程序(如视频流或连续发送和接收数据的应用程序)在Node.js中编写时可以更高效地运行。

在本教程中,您将使用Node.js运行时创建第一个程序。 您将了解一些特定于Node的概念,并构建一个程序,帮助用户检查其系统上的环境变量。 为此,您将学习如何将字符串输出到控制台,接收来自用户的输入以及访问环境变量。

先决条件

要完成本教程,您需要:

第1步 - 输出到控制台

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

nano hello.js

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

hello.js
console.log("Hello World");

Node.js中的console对象提供了简单的方法来写入stdoutstderr或任何其他Node.js流,在大多数情况下是命令行。 log方法打印到stdout流,因此您可以在控制台中看到它。

在Node.js的上下文中, 是可以接收数据的对象,如stdout流,或者可以输出数据的对象,如网络套接字或文件。 对于stdoutstderr流,发送给它们的任何数据都将显示在控制台中。 关于流的一个好处是它们很容易被重定向,例如,你可以将程序的输出重定向到一个文件。

CTRL+X保存并退出nano ,当提示保存文件时,按Y 现在您的程序已准备好运行。

第2步 - 运行程序

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

node hello.js

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

 Hello World

Node.js解释器读取文件并执行console.log("Hello World"); 通过调用全局console对象的log方法。 字符串"Hello World"作为参数传递给log函数。

虽然代码中必须使用引号来指示文本是字符串,但它们不会打印到屏幕上。

确认该程序有效后,让它更具互动性。

第3步 - 通过命令行参数接收用户输入

每次运行Node.js“Hello,World!”程序时,它都会产生相同的输出。 为了使程序更具动态性,让我们从用户那里获得输入并将其显示在屏幕上。

命令行工具通常接受修改其行为的各种参数。 例如,使用--version参数运行node打印已安装的版本,而不是运行解释器。 在此步骤中,您将通过命令行参数使代码接受用户输入。

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

nano arguments.js

输入以下代码:

arguments.js
console.log(process.argv);

process对象是一个全局 Node.js对象,它包含与当前运行的Node.js进程相关的函数和数据。 argv属性是一个字符串数组,包含给予程序的所有命令行参数。

通过键入CTRL+X保存并退出nano ,当提示保存文件时,按Y

现在,当您运行此程序时,您提供了如下命令行参数:

node arguments.js hello world

输出如下所示:

 [ '/usr/bin/node',
  '/home/sammy/first-program/arguments.js',
  'hello',
  'world' ]

process.argv数组中的第一个参数始终是运行程序的Node.js二进制文件的位置。 第二个参数始终是正在运行的文件的位置。 其余参数是用户输入的内容,在本例中为: helloworld

我们最感兴趣的是用户输入的参数,而不是Node.js提供的默认参数。 打开arguments.js文件进行编辑:

nano arguments.js

更改console.log(process.arg); 以下内容:

arguments.js
console.log(process.argv.slice(2));

因为argv是一个数组,所以您可以使用JavaScript的内置slice方法返回一系列元素。 当您提供带有2作为参数的slice函数时,您将获得第二个元素之后argv所有元素; 也就是说,用户输入的参数。

使用node命令和上次相同的参数重新运行程序:

node arguments.js hello world

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

 [ 'hello', 'world' ]

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

第4步 - 访问环境变量

环境变量是存储在程序外部并由OS提供的键值数据。 它们通常由系统或用户设置,可供所有正在运行的进程用于配置或状态目的。 您可以使用Node的process对象来访问它们。

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

nano environment.js

添加以下代码:

environment.js
console.log(process.env);

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

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

node environment.js

运行程序后,您应该看到类似于以下内容的输出:

{ 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); 至:

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

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

node environment.js

输出现在看起来像这样:

 /home/sammy

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

同样,请记住,此代码的输出可能与您在此处看到的不同,因为它特定于您的系统。 既然您可以指定要检索的环境变量,则可以通过询问用户要查看的变量来增强程序。

第6步 - 检索响应用户输入的参数

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

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

nano echo.js

添加以下代码:

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

echo.js的第一行存储用户提供给名为args的常量变量的所有命令行参数。 第二行打印存储在args的第一个元素中的环境变量; 也就是说,用户提供的第一个命令行参数。

保存并退出nano ,然后按如下方式运行程序:

node echo.js HOME

现在,输出将是:

 /home/sammy

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

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

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

第7步 - 查看多个环境变量

目前,应用程序一次只能检查一个环境变量。 如果我们可以接受多个命令行参数并在环境中获取它们的相应值,那将非常有用。 使用nano编辑echo.js

nano echo.js

编辑文件,使其具有以下代码:

echo.js
const args = process.argv.slice(2);

args.forEach(arg => {
  console.log(process.env[arg]);
});

forEach方法是所有数组对象的标准JavaScript方法。 它接受一个回调函数 ,用于迭代数组的每个元素。 你在args数组上使用forEach ,为它提供一个回调函数,用于在环境中打印当前参数的值。

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

node echo.js HOME PWD

你会看到以下输出:

 /home/sammy
/home/sammy/first-program

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

现在您可以检索用户要求的变量,但我们仍然需要处理用户输入错误数据的情况。

第8步 - 处理未定义的输入

要查看如果为程序提供的参数不是有效的环境变量会发生什么,请运行以下命令:

node echo.js HOME PWD NOT_DEFINED

输出类似于以下内容:

 /home/sammy
/home/sammy/first-program
undefined

前两行按预期打印,最后一行仅undefined 在JavaScript中, undefined值意味着尚未为变量或属性赋值。 由于NOT_DEFINED不是有效的环境变量,因此它显示为undefined

如果在环境中找不到命令行参数,则用户查看错误消息会更有帮助。

打开echo.js进行编辑:

nano echo.js

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

echo.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提供的回调函数,以执行以下操作:

  1. 获取环境中的命令行参数值并将其存储在变量envVar
  2. 检查envVar的值是否undefined
  3. 如果envVar undefined ,那么我们会打印一条有用的消息,指出无法找到它。
  4. 如果找到环境变量,我们将打印其值。

注意console.error函数通过stderr流将消息输出到屏幕,而console.log通过stdout流打印到屏幕。 当您通过命令行运行此程序时,您将不会注意到stdoutstderr流之间的区别,但最好通过stderr流打印错误,以便更容易识别和处理其他程序, 可以分辨出来。

现在再次运行以下命令:

node echo.js HOME PWD NOT_DEFINED

这次输出将是:

 /home/sammy
/home/sammy/first-program
Could not find "NOT_DEFINED" in environment

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

结论

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

如果你想进一步,你可以更改这个程序的行为。 例如,您可能希望在打印之前验证命令行参数。 如果参数未定义,则可以返回错误,并且只有在所有参数都是有效的环境变量时,用户才会获得输出。