我正在构建一个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缓存丢失了它们
答案 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') });