Node.js中子进程如何访问父进程的全局变量?
如何在Node.js子进程中访问主进程的全局变量?
这是个典型的Node.js进程间通信问题——子进程和主进程是完全独立的运行实例,各自拥有独立的内存空间,所以主进程里的global.abc根本没法直接被子进程感知到。下面给你几个实用的解决方案,按需挑选:
方案1:通过环境变量传递
这是最直接的方式之一,把变量注入到子进程的环境变量中,子进程通过process.env就能轻松获取:
主进程代码修改:
import ChildProcess = require("child_process"); import path = require("path"); // 别忘了引入path模块 global.abc = "token"; // 基于当前系统环境变量,添加我们的自定义变量 const childEnv = { ...process.env, ABC_TOKEN: global.abc }; ChildProcess.spawn("node", [path.join(process.cwd(), "./install-db.js")], { env: childEnv, stdio: "inherit" // 可选配置,让子进程的输出同步到主进程控制台 });
子进程(install-db.js)获取变量:
const token = process.env.ABC_TOKEN; console.log(token); // 输出:token
方案2:通过命令行参数传递
如果变量内容简单(无特殊字符),可以直接作为命令行参数传给子进程:
主进程代码修改:
import ChildProcess = require("child_process"); import path = require("path"); global.abc = "token"; ChildProcess.spawn("node", [ path.join(process.cwd(), "./install-db.js"), global.abc // 把token作为参数传递 ], { stdio: "inherit" });
子进程(install-db.js)获取变量:
// process.argv前两个固定是node路径和当前脚本路径,第三个开始是自定义参数 const token = process.argv[2]; console.log(token); // 输出:token
方案3:通过IPC通道传递(使用fork而非spawn)
如果需要更灵活的双向通信,建议用child_process.fork()——它是spawn的特殊版本,内置了IPC通道,支持进程间互发消息:
主进程代码修改:
import { fork } from "child_process"; import path = require("path"); global.abc = "token"; const child = fork(path.join(process.cwd(), "./install-db.js")); // 向子进程发送携带token的消息 child.send({ type: "TOKEN", data: global.abc }); // 可选:监听子进程的回复消息 child.on("message", (msg) => { console.log("子进程回复:", msg); });
子进程(install-db.js)获取变量:
process.on("message", (msg) => { if (msg.type === "TOKEN") { const token = msg.data; console.log(token); // 输出:token // 可选:给主进程回复确认消息 process.send("已成功接收token"); } });
方案4:通过标准输入(stdin)传递
如果变量是字符串或可序列化的数据,也可以通过主进程向子进程的标准输入写入数据:
主进程代码修改:
import ChildProcess = require("child_process"); import path = require("path"); global.abc = "token"; const child = ChildProcess.spawn("node", [path.join(process.cwd(), "./install-db.js")]); // 发送数据,记得加换行符(方便子进程按行读取) child.stdin.write(global.abc + "\n"); child.stdin.end(); // 关闭输入流,告知子进程数据已发送完毕
子进程(install-db.js)获取变量:
process.stdin.on("data", (data) => { const token = data.toString().trim(); // 去除换行符和多余空格 console.log(token); // 输出:token });
内容的提问来源于stack exchange,提问作者UDIT SONI
相关产品推荐
相关产品推荐

