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

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

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

请注意,当我登录时,我使用 sudo -iroot 身份进行操作。

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

为此,我在 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 中的值时,所有内容都为 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
    }
});

这里的配置有问题吗?

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

最佳答案

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

你必须做:

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

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

pm2 reload ecosystem.json --update-env

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

关于node.js - 环境变量未加载到 Nodejs 中的 process.env,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55420151/

相关文章:

javascript - 主干 .save() 上的 404 错误

javascript - 为什么我的 POST 请求没有通过 nginx 获得 proxy_passed 到我的 nodejs 应用程序?

tomcat - Jetty 和 tomcat 在浏览器上响应,但通过 cURL 给出连接被拒绝的错误

python - Django objects.all() 空查询集,在 shell 中不为空

ajax - Node.js/Express POST 请求正文解析为不正确的 JSON

node.js - 客户端(angular 2)身份验证, Passport 谷歌作为服务器(node.js)中的提供者

python - 我的基于 Web 的系统需要一个消息/队列解决方案

linux - 移动,复制文件而不使用太多内存

django - 经验丰富的 Web 开发人员如何将 Django 部署到 EC2 上的生产环境中?

amazon-web-services - 筛选具有特定端口和 IP ACL 的安全组的 AWS CLI 输出