【问题标题】:Node JS environment variables and Heroku deploymentNode JS 环境变量和 Heroku 部署
【发布时间】:2017-06-25 21:00:54
【问题描述】:

我有一个项目使用 dotenv 包在我的 NodeJS 应用程序中加载我的环境变量 我使用以下行

var dotenv = require('dotenv').load({ silent: true }); 

//Example of use
username: process.env.CONVERSATION_USERNAME

我现在计划在 Heroku 上部署这个应用程序。但是,出于一些明显的安全原因,我不想提交我的 .env 文件。

我是 NodeJS 新手,我想知道是否有办法说“如果 .env 文件不存在,请从 Heroku 加载环境变量”

谢谢, 亚历克斯

【问题讨论】:

    标签: node.js heroku environment-variables


    【解决方案1】:

    今天我偶然发现了这个问题,我尝试了几种解决方案,但都没有奏效。我的应用程序在本地运行,但在生产模式 (heroku) 下无法正确加载 process.env。

    然后我发现了这个https://www.npmjs.com/package/dotenv-webpack

    plugins: [
        new Dotenv({ systemvars: true }),
    ],
    

    只需将 systemvars 设置为 true 即可。 现在,我已经使用 .env 文件和 heroku 仪表板的不同键对此进行了测试;它们没有连接,它们在生产或开发模式下正确替换自己。

    使用包“dotenv-webpack”而不是“dotenv”。

    我希望这可以为面临同样问题的人节省一些时间

    【讨论】:

      【解决方案2】:

      我刚刚发现了这个,它对我来说非常好用。用于将 .env 变量移入/移出 Heroku 的 CLI 界面。

      https://github.com/escaladesports/heroku-dotenv

      【讨论】:

        【解决方案3】:

        我在本地 NodeJS 设置和环境变量以及部署到 Heroku 时遇到了同样的问题。

        我的解决方案是创建一个可以处理这两种情况的配置文件,并在我的项目中为我提供一个整洁、自动化的方法。

        我的 NodeJS 服务器使用babel-node 运行,所以我的配置文件是用 ES6 编写的,您可能需要根据自己的需要进行转换。

        如果我们以 .env 文件为例:

        NODE_ENV=development
        API_ENDPOINT=http://localhost:7000
        SOMETHING_ELSE=some-text
        

        还有我在 NodeJS 应用程序根目录中的 config.js

        import dotenv from 'dotenv';
        
        const result = dotenv.config();
        const envs = result.parsed;
        
        module.exports = envs;
        

        您可以在我的代码中看到,我使用 DotEnv 并创建了一个 envs 变量:let envs。在本地,我使用 DotEnv 解析我的 .env 文件并将其作为对象传递给我的应用程序。

        这意味着我可以在我的应用中轻松地从我的.env 导入我的变量:

        import { NODE_ENV } from './config';
        

        Heroku

        在 Heroku 中,您可以在 Heroku 仪表板中项目的设置页面中设置环境变量。因此,为避免将 .env 作为 repo 中的固定变量提交(您永远不应该这样做),您可以在同一配置文件中访问 process.env 全局变量。

        所以你的config.js 文件变成:

        import dotenv from 'dotenv';
        import _ from 'lodash';
        
        const result = dotenv.config();
        
        let envs;
        
        if (!('error' in result)) {
          envs = result.parsed;
        } else {
          envs = {};
          _.each(process.env, (value, key) => envs[key] = value);
        }
        
        module.exports = envs;
        

        由于我的项目中已经有 lodash,因此我使用它来处理循环通过 process.env 变量。

        注意:这使您的 dyno 中的每个 env 变量都可用,而不仅仅是您在 Heroku 仪表板中设置的变量。您可能决定要为您的环境添加前缀并将process.env 循环过滤为您想要公开给您的应用程序的变量。

        正如您在我的新配置文件中看到的那样,如果 DotEnv 运行时没有错误,那么我们可以假设存在 .env 文件并使用其中的 var 并像以前一样设置它们。

        但是,如果有错误,那么我们就假设没有.env 文件,然后回退到检查process.env 然后我们将envs var 设置为一个对象envs = {};,然后将我们在process.env 中找到的每个变量设置为键值对。然后正常导出envs

        这使得 Heroku 的环境变量可以在您的应用程序中使用,而无需在整个应用程序中更改您的逻辑。

        希望这对遇到同样问题的人有所帮助。

        【讨论】:

        • 如果使用dotenv,这应该是正确的答案。 +1 详细说明。
        • 如果使用 ES6,您可能需要使用 export { envs }; 而不是 module.exports = envs;
        【解决方案4】:

        不要将你的 .env 提交给 git(即它应该在你的 .gitignore 中)。

        您可以通过 Heroku 仪表板或使用 heroku config:set 在 Heroku 上定义环境变量,例如

        heroku config:set CONVERSATION_USERNAME=Alex
        

        更多信息请参见here

        【讨论】:

        • 非常感谢,成功了!
        猜你喜欢
        • 2020-03-06
        • 2016-06-04
        • 1970-01-01
        • 1970-01-01
        • 2017-08-11
        • 2020-10-29
        • 2022-10-23
        • 2021-03-09
        • 1970-01-01
        相关资源
        最近更新 更多