了解node.js流程变量
#javascript #教程 #node #todayilearned

节点过程和事件循环

简而言之,“过程”变量是运行您应用程序的系统过程。它还可以使您部分控制其低级行为。当您使用'node'命令运行JavaScript文件时,新的系统进程产生。

  1. Node.js runtime将您的应用程序作为系统流程初始化
  2. 主模块执行(例如'index.js'或'main.js')
  3. event loop开始排队任务(=代码块)将执行
  4. 您的应用程序开始完成其工作

应用程序启动后,我们有

  • 一个系统过程,描述和管理您的应用程序整体
  • 一个事件循环来照顾调度和执行任务

现在让我们仔细看看这两个组件。我们的重点将放在系统过程以及它如何与事件循环一起播放。

环境与过程变量

环境变量

环境变量是“ process.env”属性的一部分。该过程启动后,它们就会注入,并且可以在整个系统范围内提供。让我们举以下示例:

# In a terminal, type
echo $USER
echo $TERMINAL
// In a Javascript file, type
console.log(process.env.USER);
console.log(process.env.TERMINAL);

以上两个命令将向控制台打印相同的值。启动节点过程时,您可以注入自己的环境变量。我们将仔细研究本文稍后如何做到这一点。

过程变量

过程变量是“过程”对象本身的一部分。它们包括以下信息集:

  1. node.js版本,可执行路径和主模块路径
  2. 过程ID(PID)和参数(argv)
  3. 函数类似于'nextTick',on on on'和'kill',可以使您对过程“行为”的高级控制

过程变量未与其他过程或操作系统共享。

虽然可能会使用“过程”来声明全局变量,但您应该坚持使用本地范围的变量。或使用从哪里导入全局常数的专用“ const.js”文件。

常见用例

现在我们对对象本身有了广泛的了解,让我们看看我们可以通过节点过程做什么。

调度事件循环迭代回调

执行代码(=一个任务)的块后,事件循环等待新任务运行。就在“ nextick”事件之间。想象一下,当执行代码执行时,它就像生命周期挂钩。

查看此great article on dev.to,该great article on dev.to详细形象

让我们看一个示例。在下面的代码中,我们安排一个同步操作以在服务器响应客户端后运行。

请注意,此方法在发送响应后仍会阻止应用程序! “ nexttick”必须谨慎处理,因为它会改变事件循环的行为。使用asynchronous operation using promises or callbacks通常是一个更好的选择。

const http = require('http');
const fs = require('fs')
const server = http.createServer((req, res) => {

  // Schedule sync task to write a log file after request is completed
  process.nextTick(() => {
    fs.appendFileSync('log', `${req.method} ${req.url}\n`, { flag: 'a' });
  });

  // Respond to the client
    res.writeHead(200, { 'Content-Type': 'text/plain' });
    res.end('Hello World\n');
});

server.listen(3000);

读写环境变量

此功能允许您读写environment variables。它派上了在几个不同情况下运行的应用程序。一个突出的例子是区分您的应用程序在开发还是生产中运行。

使用环境变量和'.ENV'文件时,dotenv模块特别有用

您可以通过访问'process.env'属性来读取和编写环境变量。可以使您的环境变量独特,大写名称被认为是好习惯。

// Setting environment variables
process.env.APP_PRODUCTION_MODE = false; 
process.env.APP_DEVELOPMENT_MODE = true;

// Reading environment variables
const USER = process.env.USER; 
const LANG = process.env.LANG

捕获意外的错误

“过程”变量提供了一个事件,使您能够捕获所有未经处理的错误。处理错误的错误是一个好习惯。将此方法视为捕获意外例外的最后一个度假选项。

// Handle all otherwise uncaught errors
process.on('uncaughtException', (error) => {
  console.log(error)
});

throw new Error("An error occured");

解析过程参数(ARGV)

运行使用'node'的JavaScript文件时,您可以将额外的参数传递到其中。这些附加到'process.argv' - array(=命令行参数),可以通过您的程序读取和解析。

有节点模块,例如commanderyargs,它们使使用过程参数更加容易

此方法有助于您更多地控制应用程序的设置。例如,将端口指定为可选参数。

const http = require("http");

const server = http.createServer((req, res) => {
  res.writeHead(200, { "Content-Type": "text/plain" });
  res.end("Hello World\n");
})

server.listen(process.argv[2] || 3000);

让我们尝试一下:

// Start the server on port 2000 instead of 3000:
node index 2000

进一步阅读和来源

好奇地阅读更多?然后在过程对象上查看official Node.js docs。您也可以继续前进,打开自己喜欢的文本编辑器,然后玩。查看过程对象的行为以及还有哪些其他方法。