环境变量未加载到Node.js中的process.env

时间:2019-03-29 14:56:23

标签: node.js ubuntu amazon-ec2 environment-variables

我正在构建一个nodejs api,并已将dotenv软件包设置为dev依赖项,以将变量加载到开发人员的本地计算机上的process.env

请注意,登录时我使用sudo -i来充当root

我的意图是在部署期间,将在/etc/environment下的Ubuntu主机中设置环境变量,然后将其直接加载到进程中,然后该应用程序将针对该配置运行。

为此,我在server.js的开头一行:

if(process.env.NODE_ENV === 'development') {
    logger.info("Loading dotenv for development environment")
    require('dotenv').config();
}

并且将指示开发人员为NODE_ENV向其系统添加环境变量。

现在,在我的Ubuntu EC2实例中,我已经设置了/etc/environment以具有所需的环境变量(请注意,这里的NODE_ENV为'dev'只是为了避免运行dotenv):

PORT=MYPORT
NODE_ENV=dev
APP_SECRET_KEY='MYSECRET'
APP_DATABASE_LOGIN=MYLOGIN
APP_DATABASE_PASSWORD='MYPASS'
APP_DATABASE_HOST=MYHOST
APP_DATABASE_NAME=MYDB
APP_DATABASE_PORT=MYDBPORT

当我重新启动并运行printenv时,每个文件都会填充它们。

我已经设置pm2来直接从server.js运行我的应用程序,而无需任何其他配置,因为据我了解,process.env是从环境变量自动填充的。

但是,当我记录来自process.env的值时,我只是对所有内容都为空:

logger.info({
    connectionConfig: {
        host: process.env.APP_DATABASE_HOST
        , login: process.env.APP_DATABASE_LOGIN
        , port: process.env.APP_DATABASE_PORT
        , databaseName: process.env.APP_DATABASE_NAME
    }
});

这里的配置是否存在问题?

注意:根据下面的答案,我在启动pm2之后错误地设置了环境变量,因此pm2缓存丢失了它们

3 个答案:

答案 0 :(得分:3)

我遇到了同样的问题,这是因为Visual Studio和Visual Studio代码中集成了终端,看来除非您在Admin模式下运行编辑器,否则他们似乎无法访问任何这些变量。这个问题,您只需要以Amin模式启动编辑器

答案 1 :(得分:2)

问题是pm2缓存了环境变量。

您必须这样做:

# all apps
pm2 restart all --update-env
# specific app
pm2 restart {pid} --update-env

如果由于某种原因不起作用,则记录的方式为:

pm2 reload ecosystem.json --update-env

您可以在here中阅读更多内容:

答案 2 :(得分:0)

确保您的app.js文件中包含此代码

> const path = require('path');  require('dotenv').config({ path:
> path.join(__dirname, '.env') });