Node.js process 对象
简介
process 对象是 Node.js 中的一个全局对象,它提供了当前 Node.js 进程的信息并对其进行控制。通过 process 对象,我们可以获取环境信息、处理进程事件、控制进程行为等。本指南将详细介绍 process 对象的主要功能和使用方法。
基本属性
环境相关
- process.env:包含了运行环境的用户环境变量
- process.version:Node.js 版本信息
- process.platform:运行平台信息(如 ‘darwin’, ‘win32’, ‘linux’)
- process.arch:CPU 架构信息(如 ‘x64’, ‘arm’)
进程相关
- process.pid:当前进程的 ID
- process.title:进程名称,可读写
- process.uptime():进程运行时间(秒)
- process.memoryUsage():内存使用情况
标准流和输入输出
标准流对象
// 标准输出
process.stdout.write('Hello World\n');// 标准错误
process.stderr.write('发生错误!\n');// 标准输入
process.stdin.on('data', (data) => {console.log(`接收到输入:${data}`);
});
进程事件处理
主要事件
// 进程退出前
process.on('exit', (code) => {console.log(`进程退出,退出码:${code}`);
});// 未捕获的异常
process.on('uncaughtException', (err) => {console.error('发生未捕获的异常:', err);
});// Promise 未处理的拒绝
process.on('unhandledRejection', (reason, promise) => {console.error('未处理的 Promise 拒绝:', reason);
});
进程控制
退出进程
// 正常退出
process.exit(0);// 异常退出
process.exit(1);
进程信号处理
// 处理 SIGINT 信号(通常是 Ctrl+C)
process.on('SIGINT', () => {console.log('接收到 SIGINT 信号');process.exit(0);
});
命令行参数
process.argv
// 输出命令行参数
console.log(process.argv);
// 第一个元素:Node.js 可执行文件路径
// 第二个元素:当前执行的文件路径
// 后续元素:命令行参数
环境变量的使用
访问和设置环境变量
// 访问环境变量
console.log(process.env.NODE_ENV);// 设置环境变量
process.env.MY_VARIABLE = 'value';
最佳实践
1. 优雅退出
process.on('SIGTERM', () => {console.log('收到 SIGTERM 信号');// 清理资源db.close();server.close(() => {console.log('进程已优雅退出');process.exit(0);});
});
2. 异常处理
process.on('uncaughtException', (err) => {console.error('未捕获的异常:', err);// 记录错误日志logger.error(err);// 确保资源被正确释放后再退出process.exit(1);
});
3. 环境配置
const isDevelopment = process.env.NODE_ENV === 'development';
const config = {debug: isDevelopment,port: process.env.PORT || 3000,dbUrl: process.env.DB_URL || 'localhost'
};
注意事项
- 不要在
uncaughtException
事件处理器中恢复应用运行,应该记录错误并重启进程 - 使用环境变量时注意安全性,不要将敏感信息直接硬编码
- 在处理大量数据时要注意内存使用情况,可以通过
process.memoryUsage()
监控 - 适当使用
process.nextTick()
来优化事件循环
调试技巧
使用 process.hrtime() 进行性能分析
const start = process.hrtime();// 执行一些操作const end = process.hrtime(start);
console.log(`操作耗时:${end[0]}s ${end[1]}ns`);
监控内存使用
setInterval(() => {const usage = process.memoryUsage();console.log(`内存使用情况:RSS: ${usage.rss / 1024 / 1024}MB堆总大小: ${usage.heapTotal / 1024 / 1024}MB堆使用: ${usage.heapUsed / 1024 / 1024}MB`);
}, 1000);