Node.js 简介

process 全局对象与环境变量

掌握 Node.js process 对象的常用属性和方法,学会用环境变量区分开发与生产环境。

🎯 引言

学完这篇文章,你能用 process 对象读取命令行参数和环境变量,写出根据不同环境切换配置的程序,还会正确退出进程并理解退出码的含义。


🧱 process 是什么

process 是 Node.js 的全局对象,代表当前正在运行的这个 Node 进程。它不用 requireimport,在任何文件里都能直接用。

可以把它理解成程序的“仪表盘和控制台”:程序运行在哪、用户传了什么参数、当前是什么环境、要不要退出,都通过它来查看和操作。


🛠 process.argv 读取命令行参数

执行 node greet.js 小明 18 时,process.argv 能拿到命令行里传入的参数,它是一个数组:

  • 第 0 项:node 可执行文件的路径。
  • 第 1 项:当前脚本文件的路径。
  • 从索引 2 开始,才是我们自己传的参数。

写一个打招呼的小工具:

greet.js
const name = process.argv[2];

console.log(`你好,${name}!欢迎学习 Node.js`);
node greet.js 小明
# 输出:你好,小明!欢迎学习 Node.js
argv 拿到的参数全部是字符串。传 18 拿到的也是 '18',要做数学计算记得先用 Number() 转换。

🛠 process.env 环境变量

环境变量是从程序外部注入的配置,比如数据库地址、密钥、当前环境。它们不写在代码里,程序启动时通过 process.env 读取,这样既灵活又安全。

读取方式很简单,就像一个普通对象:

env.js
console.log(process.env.NODE_ENV); // 未设置时是 undefined

在命令行临时设置一个环境变量再运行:

# macOS / Linux
NODE_ENV=production node env.js

# Windows PowerShell 写法不同
$env:NODE_ENV="production"; node env.js

环境变量只在这一次进程运行期间生效,关掉终端窗口就没了。


💡 用环境变量区分环境

实际项目里,开发环境和生产环境的配置往往不同。用 NODE_ENV 切换配置是社区里非常普遍的做法:

config.js
const isProd = process.env.NODE_ENV === 'production';

const config = {
    // 占位配置,实际项目换成真实的地址
    apiUrl: isProd ? 'https://api.example.com' : 'http://localhost:3000',
    debug: !isProd,
};

console.log('当前配置:', config);
node config.js                      # 开发配置
NODE_ENV=production node config.js  # 生产配置
Windows 设置环境变量的语法和 macOS/Linux 不一样,跨平台项目常用 cross-env 包统一写法(本文环境:Node.js v22,cross-env@7)。装上后在 package.json 的脚本里写 cross-env NODE_ENV=production node app.js 即可,各个系统都能跑。

🛠 其他常用成员

others.js
// 当前工作目录:你在哪个目录执行的 node 命令(path 一篇详细讲过)
console.log(process.cwd());

// 当前 Node.js 版本
console.log(process.version); // v22.x.x

// 退出进程:0 表示正常结束,非 0 表示异常退出
if (!process.env.NODE_ENV) {
    console.log('缺少 NODE_ENV 环境变量');
    process.exit(1);
}

退出码常用来告诉外部脚本“这次运行成功还是失败”,CI 流水线就是靠它判断任务成败的。


🧾 小节总结

  • process 是全局对象,代表当前 Node 进程,无需引入即可使用。
  • process.argv 读取命令行参数,用户参数从索引 2 开始,且全部是字符串。
  • process.env 读取环境变量,只在当前进程生效,常用于注入外部配置。
  • NODE_ENV 区分开发和生产环境是社区的普遍做法,跨平台可用 cross-env。
  • process.exit(0) 正常退出,非 0 表示异常,退出码可供外部脚本判断结果。

❓ 知识问答

Q1:process 需要 import 引入吗?

不需要,它是全局对象,任何文件里直接使用即可。

Q2:环境变量会保存到文件里吗?

不会。命令行里设置的环境变量只在这次进程运行期间存在于内存中,进程结束就消失了。想持久管理可以配合 .env 文件,那是工具包提供的方案,后续框架课程会接触。

Q3:为什么 argv 读到的数字参数计算结果不对?

因为参数都是字符串,'18' + 1 得到的是 '181'。计算前先 Number(process.argv[2]) 转换。

Q4:process.exit 后面的代码还会执行吗?

不会。process.exit 会立即终止进程,后面的代码没有机会运行,异步队列里的任务也会被丢弃,所以退出前要把该做的事情做完。


🧪 小练习

写一个加法计算器:执行 node add.js 3 5 输出 结果:8。要求:参数不足两个时提示“请传入两个数字”并以退出码 1 结束程序。

add.js
// 请在这里编写代码

🎉 恭喜你已经掌握 process 对象的核心用法!下一篇是这门课程的收官篇:events 事件模块,理解 Node.js 事件驱动的编程思想。