我正在构建一个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();
}
并且开发人员将被指示向他们的系统中添加 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/