Node.js是一个流行的开源运行时环境,可以使用V8 JavaScript引擎在浏览器外部执行JavaScript,该引擎与用于支持Google Chrome Web浏览器JavaScript执行的引擎相同。 Node运行时通常用于创建命令行工具和Web服务器。
学习Node.js将允许您使用相同的语言编写前端代码和后端代码。 在整个中使用JavaScript有助于缩短上下文切换的时间,并且可以在后端服务器和前端项目之间更轻松地共享库。
此外,由于支持异步执行,Node.js擅长I / O密集型任务,这使得它非常适合Web。 实时应用程序(如视频流或连续发送和接收数据的应用程序)在Node.js中编写时可以更高效地运行。
在本教程中,您将使用Node.js运行时创建第一个程序。 您将了解一些特定于Node的概念,并构建一个程序,帮助用户检查其系统上的环境变量。 为此,您将学习如何将字符串输出到控制台,接收来自用户的输入以及访问环境变量。
要完成本教程,您需要:
写一个“Hello,World!” 程序,打开命令行文本编辑器如nano
并创建一个新文件:
nano hello.js
打开文本编辑器,输入以下代码:
hello.js
console.log("Hello World");
Node.js中的console
对象提供了简单的方法来写入stdout
, stderr
或任何其他Node.js流,在大多数情况下是命令行。 log
方法打印到stdout
流,因此您可以在控制台中看到它。
在Node.js的上下文中, 流是可以接收数据的对象,如stdout
流,或者可以输出数据的对象,如网络套接字或文件。 对于stdout
和stderr
流,发送给它们的任何数据都将显示在控制台中。 关于流的一个好处是它们很容易被重定向,例如,你可以将程序的输出重定向到一个文件。
按CTRL+X
保存并退出nano
,当提示保存文件时,按Y
现在您的程序已准备好运行。
要运行此程序,请使用node
命令,如下所示:
node hello.js
hello.js
程序将执行并显示以下输出:
Output Hello World
Node.js解释器读取文件并执行console.log("Hello World");
通过调用全局console
对象的log
方法。 字符串"Hello World"
作为参数传递给log
函数。
虽然代码中必须使用引号来指示文本是字符串,但它们不会打印到屏幕上。
确认该程序有效后,让它更具互动性。
每次运行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
输出如下所示:
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);
以下内容:
arguments.js
console.log(process.argv.slice(2));
因为argv
是一个数组,所以您可以使用JavaScript的内置slice
方法返回一系列元素。 当您提供带有2
作为参数的slice
函数时,您将获得第二个元素之后的argv
所有元素; 也就是说,用户输入的参数。
使用node
命令和上次相同的参数重新运行程序:
node arguments.js hello world
现在,输出看起来像这样:
Output [ 'hello', 'world' ]
现在您可以收集用户的输入,让我们从程序的环境中收集输入。
环境变量是存储在程序外部并由OS提供的键值数据。 它们通常由系统或用户设置,可供所有正在运行的进程用于配置或状态目的。 您可以使用Node的process
对象来访问它们。
使用nano
创建一个新的文件environment.js
:
nano environment.js
添加以下代码:
environment.js
console.log(process.env);
env
对象存储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' }
请记住,您看到的许多环境变量都取决于系统的配置和设置,并且您的输出可能与您在此处看到的大不相同。 您可能希望检索特定的环境变量,而不是查看很长的环境变量列表。
在此步骤中,您将使用全局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
输出现在看起来像这样:
Output /home/sammy
现在,您只打印process.env
的HOME
属性,而不是打印整个对象,该属性存储$HOME
环境变量的值。
同样,请记住,此代码的输出可能与您在此处看到的不同,因为它特定于您的系统。 既然您可以指定要检索的环境变量,则可以通过询问用户要查看的变量来增强程序。
接下来,您将使用读取命令行参数和环境变量的功能来创建命令行实用程序,该实用程序将环境变量的值输出到屏幕。
使用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
现在,输出将是:
Output /home/sammy
参数HOME
保存到args
数组,然后通过process.env
对象用于在环境中查找其值。
此时,您现在可以访问系统上任何环境变量的值。 要验证这一点,请尝试查看以下变量: PWD
, USER
, PATH
。
检索单个变量很好,但让用户指定他们想要的变量数会更好。
目前,应用程序一次只能检查一个环境变量。 如果我们可以接受多个命令行参数并在环境中获取它们的相应值,那将非常有用。 使用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
你会看到以下输出:
Output /home/sammy
/home/sammy/first-program
forEach
函数确保打印args
数组中的每个命令行参数。
现在您可以检索用户要求的变量,但我们仍然需要处理用户输入错误数据的情况。
要查看如果为程序提供的参数不是有效的环境变量会发生什么,请运行以下命令:
node echo.js HOME PWD NOT_DEFINED
输出类似于以下内容:
Output /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
提供的回调函数,以执行以下操作:
envVar
。envVar
的值是否undefined
。envVar
undefined
,那么我们会打印一条有用的消息,指出无法找到它。注意 : console.error
函数通过stderr
流将消息输出到屏幕,而console.log
通过stdout
流打印到屏幕。 当您通过命令行运行此程序时,您将不会注意到stdout
和stderr
流之间的区别,但最好通过stderr
流打印错误,以便更容易识别和处理其他程序, 可以分辨出来。
现在再次运行以下命令:
node echo.js HOME PWD NOT_DEFINED
这次输出将是:
Output /home/sammy
/home/sammy/first-program
Could not find "NOT_DEFINED" in environment
现在,当您提供的命令行参数不是环境变量时,您会收到一条明确的错误消息,说明如此。
您的第一个程序在屏幕上显示“Hello World”,现在您已编写了一个Node.js命令行实用程序,该实用程序读取用户参数以显示环境变量。
如果你想进一步,你可以更改这个程序的行为。 例如,您可能希望在打印之前验证命令行参数。 如果参数未定义,则可以返回错误,并且只有在所有参数都是有效的环境变量时,用户才会获得输出。
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。