node dotenv不适用于pm2

m-k*_*tan 5 javascript node.js

我有一个应用程序在本地(没有pm2).env文件中的所有环境变量工作正常使用dotenv.

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

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

pm2 start myapp/app.js
pm2 startup
pm2 save
Run Code Online (Sandbox Code Playgroud)

And*_*enz 19

这里的一个好模式是从您的代码中删除 dotenv 并在命令行上“要求”它。这使您的代码可以在任何环境(包括基于云的)之间很好地传输 - 这是环境变量的主要功能之一。

注意:在服务器上运行时,您仍然需要通过 npm 在项目中安装 dotenv。

a) 将你的 .env 文件与你的脚本一起编码(例如 app.js)

b) 在没有 pm2 的情况下运行您的脚本:

node -r dotenv/config app.js
Run Code Online (Sandbox Code Playgroud)

c) 在 pm2.config.js 中:

module.exports = {
  apps : [{
    name      : 'My Application',
    script    : 'app.js',
    node_args : '-r dotenv/config',
    ...
  }],
}
Run Code Online (Sandbox Code Playgroud)

进而 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',
    ...
  },
}]};
Run Code Online (Sandbox Code Playgroud)

如果您将 pm2.config 视为环境配置并且在 git 等之外,这将非常有用。它只是不需要单独的 .env,这可能适合您。它完全不需要 dotenv,因为 pm2 将 env 变量注入到脚本的进程中

  • c) 对我不起作用:`错误:找不到模块'dotenv/config'` (4认同)

Mar*_*nde 14

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

当你打电话pm2 start myapp/app.js它不会搜索myapp/.env.

.env // It will try to load this, which doesn't exist
myapp/
   app.js
Run Code Online (Sandbox Code Playgroud)

所以你有两个解决方案

使用path选项:

const path = require('path'); 
require('dotenv').config({ path: path.join(__dirname, '.env') });
Run Code Online (Sandbox Code Playgroud)

或者从里面调用你的脚本 myapp/

pm2 start app.js
Run Code Online (Sandbox Code Playgroud)


小智 7

我遇到了同样的问题,但没有清楚地解释,所以这里是基于 github 用户 vmarchaud评论的解决方案。这也解决了人们对@Andy Lorenz 解决方案的问题。

就我而言,我想为多个应用程序创建一个生态系统文件,但我不断得到

Error: Cannot find module 'dotenv/config'
Run Code Online (Sandbox Code Playgroud)

解决方案很简单。您必须声明 cwd,即从中读取 dotenv/config 的项目文件夹。

module.exports = {
  apps: [{
    name: 'app1 name',
    script: 'app1.js',
    cwd: '/path/to/folder/',
    exec_mode: 'fork_mode',
    node_args: '-r dotenv/config',
  }, {
    name: 'app2 name',
    script: 'app2.js',
    cwd: '/path/to/folder/',
    instances: 'max',
    exec_mode: 'cluster',
    node_args: '-r dotenv/config',
  }],
};
Run Code Online (Sandbox Code Playgroud)


Ahm*_*med 7

你先杀了你 pm2 进程

尝试

pm2 kill
Run Code Online (Sandbox Code Playgroud)

然后使用重新启动pm2

pm2 start app.js
Run Code Online (Sandbox Code Playgroud)