节点 dotenv 不适用于 pm2

新手上路,请多包涵

我有一个应用程序,其中本地(没有 pm2) .env 文件中的所有环境变量使用 dotenv 工作得很好。

但是在我使用 pm2 运行应用程序的服务器上,环境变量仍然存在 undefined

我用来在服务器上运行应用程序的 pm2 命令是:

 pm2 start myapp/app.js
pm2 startup
pm2 save

原文由 m-ketan 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 781
2 个回答

dotenv 将读取位于当前目录中的 .env 文件。

当您调用 pm2 start myapp/app.js 时,它不会搜索 myapp/.env

 .env // It will try to load this, which doesn't exist
myapp/
   app.js

所以你有两个解决方案

使用 path 选项:

 const path = require('path');
require('dotenv').config({ path: path.join(__dirname, '.env') });

或者从内部调用你的脚本 myapp/

 pm2 start app.js

原文由 Marcos Casagrande 发布,翻译遵循 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 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏