nodejs + express
有一个 server.js 脚本,里面会启动 express server 现在,我想通过命令行参数,添加环境变量,例如
node server.js --port --test
即在 server.js 里面 根据参数 --test 再去设置比如 process.env["test"],因为后面的.js 里面需要使用这个变量。
const program = require("commander");
progra.option("-p, --port", "").option("-t, --test", "").parse(process.argv);
if (program.test) {
process.env["test"] = "true";
}
我试着直接设置 process.env["test"],结果不行。 因为在后面的 index.tsx ,或者 webpack.dev.js 里面,尝试读取 process.env["test"]会失败,返回 undefined.
所以,特来请教。
1
ysc3839 2021-01-18 16:35:51 +08:00 via Android
可能是要 process.env.foo = 'bar'; 这样
https://nodejs.org/dist/latest-v8.x/docs/api/process.html#process_process_env |
2
DL9412 2021-01-18 16:44:14 +08:00
首先,这个配置生效了吗?
我没看到你这个 progra 的实例化声明。是否可以理解为 progra.option 应为 program.option,检查一下拼写? |
3
yazoox OP @DL9412 typo issue,忽略那个。
@ysc3839 其实,你的这个方法,以及我的方法,process.env.test 或者 process.env["test"] 在 server.js 里面,都是有效的。因为我后面添加了 ``` if (process.env.test) { console.log("test is enabled"); } 或者 if (process.env["test"]) { console.log("test is enabled"); } ``` 在运行 node server.js --test 后,在 mac terminal 里面,都打印出来了这一行。说明 这个环境 变量设置上去了。 但是,后面在 build webpack.dev.js 以前 项目代码里面,再去读取这个值,貌似就读不到了...... |
4
flyingfz 2021-01-18 17:26:56 +08:00 1
build webpack.dev.js 怀疑在这个步骤里, 是另外一个独立的进程了。 不清楚你具体的场景是怎么样的。
这个问题,应该要考虑 在 node server.js 前, 设置环境变量. 而不要想着 通过 参数, 再设置 process.env["xxx"] 这种方式。. |
5
Jirajine 2021-01-18 17:29:40 +08:00 via Android
@yazoox 有没有设置上去你得从外部看。
通过 /proc 或 直接 htop 按 e 检查运行的进程环境变量是否生效,以及其子进程是否继承到了。 |
6
nigelvon 2021-01-18 17:32:41 +08:00
NODE_ENV=development node server.js
|
7
66450146 2021-01-18 19:57:53 +08:00
如果在 node 启动 express server 的时候,添加环境变量到 process.env 里面去,那么你就可以从 process.env 中读取到添加的环境变量
|
8
yazoox OP @flyingfz 你的怀疑是对的。就是这里出的问题。
我们的 webpack.dev.js 里面,使用 webpack 的插件,修改了 process.env, e.g: new webpack.DefinePlugin({ "process.env": { NODE_ENV: JSON.stringify("development"), ... } }) 所以 ,我添加了一句 TEST: process.env.test ? "test": undefined 然后,在我的 project 里面,直接使用 if (process.env.TEST) { } 就可以工作了。 |