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

C B*_*uer 4 ubuntu environment-variables amazon-ec2 node.js

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

需要注意的是,当我登录我用sudo -i的操作root

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

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

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

并且将指示开发人员将环境变量添加到他们的系统中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
Run Code Online (Sandbox Code Playgroud)

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

我已经设置pm2为直接从server.js没有任何额外配置的情况下运行我的应用程序,因为据我所知,它process.env是从环境变量自动填充的。

但是,当我从 process.env 记录值时,我只会为所有内容获取 null:

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
    }
});
Run Code Online (Sandbox Code Playgroud)

这里的配置有问题吗?

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

Mar*_*nde 9

问题是pm2缓存环境变量。

你必须要做:

# all apps
pm2 restart all --update-env
# specific app
pm2 restart {pid} --update-env
Run Code Online (Sandbox Code Playgroud)

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

pm2 reload ecosystem.json --update-env
Run Code Online (Sandbox Code Playgroud)

你可以在这里阅读更多:

  • 嗨马科斯 - 谢谢你。你最初的问题让我进行了调查,我得出了同样的结论。但是,我的解决方法是执行`pm2 restart --update-env all`。你能把它作为你答案的第一行,所以我可以接受吗? (2认同)

小智 5

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