V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
yazoox
V2EX  ›  Node.js

请问,如果在 node 启动 express server 的时候,添加环境变量到 process.env 里面去?

  •  
  •   yazoox · 2021-01-18 16:32:17 +08:00 · 2083 次点击
    这是一个创建于 1166 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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.

    所以,特来请教。

    8 条回复    2021-01-18 21:57:00 +08:00
    ysc3839
        1
    ysc3839  
       2021-01-18 16:35:51 +08:00 via Android
    DL9412
        2
    DL9412  
       2021-01-18 16:44:14 +08:00
    首先,这个配置生效了吗?

    我没看到你这个 progra 的实例化声明。是否可以理解为 progra.option 应为 program.option,检查一下拼写?
    yazoox
        3
    yazoox  
    OP
       2021-01-18 17:18:21 +08:00
    @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 以前 项目代码里面,再去读取这个值,貌似就读不到了......
    flyingfz
        4
    flyingfz  
       2021-01-18 17:26:56 +08:00   ❤️ 1
    build webpack.dev.js 怀疑在这个步骤里, 是另外一个独立的进程了。 不清楚你具体的场景是怎么样的。

    这个问题,应该要考虑 在 node server.js 前, 设置环境变量. 而不要想着 通过 参数, 再设置 process.env["xxx"] 这种方式。.
    Jirajine
        5
    Jirajine  
       2021-01-18 17:29:40 +08:00 via Android
    @yazoox 有没有设置上去你得从外部看。
    通过 /proc 或 直接 htop 按 e 检查运行的进程环境变量是否生效,以及其子进程是否继承到了。
    nigelvon
        6
    nigelvon  
       2021-01-18 17:32:41 +08:00
    NODE_ENV=development node server.js
    66450146
        7
    66450146  
       2021-01-18 19:57:53 +08:00
    如果在 node 启动 express server 的时候,添加环境变量到 process.env 里面去,那么你就可以从 process.env 中读取到添加的环境变量
    yazoox
        8
    yazoox  
    OP
       2021-01-18 21:57:00 +08:00
    @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) {

    }

    就可以工作了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5296 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 09:20 · PVG 17:20 · LAX 02:20 · JFK 05:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.