节点过程和事件循环
简而言之,“过程”变量是运行您应用程序的系统过程。它还可以使您部分控制其低级行为。当您使用'node'命令运行JavaScript文件时,新的系统进程产生。
- Node.js runtime将您的应用程序作为系统流程初始化
- 主模块执行(例如'index.js'或'main.js')
- event loop开始排队任务(=代码块)将执行
- 您的应用程序开始完成其工作
应用程序启动后,我们有
- 一个系统过程,描述和管理您的应用程序整体
- 一个事件循环来照顾调度和执行任务
现在让我们仔细看看这两个组件。我们的重点将放在系统过程以及它如何与事件循环一起播放。
环境与过程变量
环境变量
环境变量是“ 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);
以上两个命令将向控制台打印相同的值。启动节点过程时,您可以注入自己的环境变量。我们将仔细研究本文稍后如何做到这一点。
过程变量
过程变量是“过程”对象本身的一部分。它们包括以下信息集:
- node.js版本,可执行路径和主模块路径
- 过程ID(PID)和参数(argv)
- 函数类似于'nextTick',on on on'和'kill',可以使您对过程“行为”的高级控制
过程变量未与其他过程或操作系统共享。
虽然可能会使用“过程”来声明全局变量,但您应该坚持使用本地范围的变量。或使用从哪里导入全局常数的专用“ const.js”文件。
常见用例
现在我们对对象本身有了广泛的了解,让我们看看我们可以通过节点过程做什么。
调度事件循环迭代回调
执行代码(=一个任务)的块后,事件循环等待新任务运行。就在“ nextick”事件之间。想象一下,当执行代码执行时,它就像生命周期挂钩。
让我们看一个示例。在下面的代码中,我们安排一个同步操作以在服务器响应客户端后运行。
请注意,此方法在发送响应后仍会阻止应用程序! “ 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(=命令行参数),可以通过您的程序读取和解析。
此方法有助于您更多地控制应用程序的设置。例如,将端口指定为可选参数。
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。您也可以继续前进,打开自己喜欢的文本编辑器,然后玩。查看过程对象的行为以及还有哪些其他方法。