我有一个在 NodeJS 上运行的服务器。有没有办法在不重启服务器的情况下更新进程中的环境变量?
我想做的是:
npm start
type something into the console to update ENV variable
从编程的角度来看,您应该能够更新传递到正在运行的进程中的
process.env
变量。
例如运行:
cmd_line$: MY_VALUE=some_val node ./index.js
带有代码:
console.log(process.env.MY_VALUE)
process.env.MY_VALUE = 'some other value'
console.log(process.env.MY_VALUE)
process.env.MY_VALUE = 4
console.log(process.env.MY_VALUE)
终端输出:
some_val
some other value
4
从服务器管理的角度来看,对于已经运行的应用程序,我不知道答案。
可以调试 Node.js 进程并更改全局变量:
在 *nix 上,即使进程未在调试模式下启动,也可以启用调试。在 Windows 上,只能调试以
node --inspect
启动的进程。 本文详细解释了这两种可能性。
显然,只有在始终直接使用环境变量时才有效,如
process.env.FOO
。
如果最初使用它们的值,稍后更改
process.env.FOO
可能不会产生任何影响:
const FOO = process.env.FOO;
...
console.log(FOO); // it doesn't matter whether process.env.FOO was changed at this point
如果您对环境变量进行更改,只有当您通过系统的主属性对话框进行更改时,这些变量才会立即发生,该对话框将转到我的计算机 -> 高级属性 -> 环境变量。
任何已经运行的程序都不会看到更改,除非我们在代码中显式处理它。
其背后的逻辑是,有一个代理发送广播 WM_SETTINGCHANGE 消息并对所有应用程序进行更改,以便通知该更改。
这里有一个关于如何在 mac OS 中设置环境变量的很好的解释。此外,正如其他人已经回答的那样,您可以使用
process.env.ANY_VARIABLE = 'some value'
设置它们。
我正在尝试找到一个跨平台的答案(mac、linux、windows)
对于 Mac,我发现的解决方法是使用
const shell = require("shelljs");
console.log(shell.exec('launchctl getenv TEST'));
仅当您使用
launchctl setenv TEST blahblah
设置环境变量(例如在其他终端选项卡中)时才有效
您可以尝试使用这个 JavaScript 小库来更新环境变量,而无需重新启动节点服务器:
https://www.npmjs.com/package/runtime-node-refresh
希望这有帮助。
process.env.WHATEVER = ...
更新一个对象,如果你console.log(process.env.WHATEVER)
,你将记录该值,并且它与实际的环境无关。您的 current 程序的其他部分现在可以访问 process.env.WHATEVER
,因为它是 JavaScript 程序内部全局变量上的路径。
但是!如果您想执行子程序并期望它们与当前进程具有相同的
env
,则需要显式地将您的env传递给exec/spawn命令。 F.e.:
exec('echo $WHATEVER', {env: process.env})
与spawn等类似
如果您不将
env
传递给子进程创建命令,它们将不会自动从父进程继承 env。
您还可以将
env
设置为与父级完全不同的内容。