我有一个应用程序,其中本地(没有 pm2) .env
文件中的所有环境变量使用 dotenv
工作得很好。
但是在我使用 pm2
运行应用程序的服务器上,环境变量仍然存在 undefined
。
我用来在服务器上运行应用程序的 pm2 命令是:
pm2 start myapp/app.js
pm2 startup
pm2 save
原文由 m-ketan 发布,翻译遵循 CC BY-SA 4.0 许可协议
我有一个应用程序,其中本地(没有 pm2) .env
文件中的所有环境变量使用 dotenv
工作得很好。
但是在我使用 pm2
运行应用程序的服务器上,环境变量仍然存在 undefined
。
我用来在服务器上运行应用程序的 pm2 命令是:
pm2 start myapp/app.js
pm2 startup
pm2 save
原文由 m-ketan 发布,翻译遵循 CC BY-SA 4.0 许可协议
这里的一个好的模式是从您的代码中删除 dotenv 并在命令行上“要求”它。这使您的代码可以在任何环境(包括基于云的环境)之间很好地传输——这是环境变量的主要特征之一。
注意:在服务器上运行时,您仍然需要通过 npm 在项目中安装 dotenv。
a) 将你的 .env 文件与你的脚本一起编码(例如 app.js)
b) 在没有 pm2 的情况下运行你的脚本:
node -r dotenv/config app.js
c) 在 pm2.config.js 中:
module.exports = {
apps : [{
name : 'My Application',
script : 'app.js',
node_args : '-r dotenv/config',
...
}],
}
然后 pm2 start pm2.config.js
注意:在命令行中使用 dotenv/config 是 dotenv 自己推荐的最佳实践之一
编辑 2021:为了完整性——因为我的回答有一些问题,我想在列表中添加第四个选项:
d) 结合 pm2/env 配置
module.exports = { apps : [{
name : 'My Application',
script : 'app.js',
env : {
PORT: 5010,
DB_STRING: 'mongodb://localhost:27017',
...
},
}]};
如果您将 pm2.config 视为环境配置并且在 git 等之外,这将很有用。它只是否定了对单独的 .env 的需要,这可能适合您。当 pm2 将 env 变量注入脚本的进程时,它完全不需要 dotenv
原文由 Andy Lorenz 发布,翻译遵循 CC BY-SA 4.0 许可协议
13 回答12.7k 阅读
7 回答1.9k 阅读
3 回答2.6k 阅读✓ 已解决
3 回答1.1k 阅读✓ 已解决
2 回答1.1k 阅读✓ 已解决
6 回答804 阅读✓ 已解决
6 回答1k 阅读
dotenv
将读取位于当前目录中的.env
文件。当您调用
pm2 start myapp/app.js
时,它不会搜索myapp/.env
。所以你有两个解决方案
使用
path
选项:或者从内部调用你的脚本
myapp/