node dotenv不适用于pm2

时间:2018-06-04 22:31:23

标签: javascript node.js

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

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

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

pm2 start myapp/app.js
pm2 startup
pm2 save

7 个答案:

答案 0 :(得分:10)

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

答案 1 :(得分:3)

您先杀死了pm2进程

尝试

pm2 kill

然后使用重新启动pm2

pm2 start app.js

答案 2 :(得分:1)

我遇到了同样的问题,但是没有明确解释,因此这里的解决方案基于 github用户vmarchaud comment。 这也解决了人们使用@Andy Lorenz解决方案时遇到的问题。

就我而言,我想为多个应用程序创建一个生态系统文件,但我一直在获取

Error: Cannot find module 'dotenv/config'

解决方案很简单。 您必须声明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',
  }],
};

答案 3 :(得分:0)

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

a)在脚本(例如app.js)旁边编码.env文件

b)在不使用pm2的情况下运行脚本:

node -r dotenv/config app.js
pm2.config.js中的

c):

module.exports = {
  apps : [{
    name      : 'My Application',
    script    : 'app.js',
    node_args : dotenv/config',
    ...
  }],
}

然后     pm2 start pm2.config.js

注意:在命令行上使用dotenv / config是dotenv自己推荐的最佳实践之一。

答案 4 :(得分:0)

我使用的是@Marcos答案的简单得多的版本:

.env
app.js

例如,我们需要将令牌存储在.env文件中,并将其直接传递给app.js: 在.env内部

token=value

在app.js内部:

require('dotenv').config();
console.log(process.env.token)

也不要忘记。如果将.env文件添加到.gitignore,然后git pull在VPS或smth上回购,则需要手动复制.env文件,否则您的应用程序将无法正常工作。

在某些情况下,使用配置的区域很重要,因此请确保将NODE_ENV=production字符串添加到.env文件中。

毕竟,您可以直接在应用程序的文件夹中使用pm2 start app.js

答案 5 :(得分:0)

这是我的项目设置..

/src/app.ts

然后编译到 dist 文件夹中。

/dist/app.js

我的 .env 文件在 dist 文件夹之外,因此无法访问。

这是我试过的命令。 pm2 启动 app.js --env=.env

答案 6 :(得分:0)

这些都不适合我,因为我使用的是集群模式。

我在根目录中安装了 dotenv 作为 dev 依赖项(我也使用了 yarn 工作区)。

然后我这样做了:

require('dotenv').config({ path: 'path/to/your/.env' })

module.exports = {
    apps: [
        {
            name: 'app',
            script: 'server/dist/index.js',
            instances: 2,
            exec_mode: 'cluster',
            instance_var: 'APP_INSTANCE_SEQ',
            // listen_timeout: 10000,
            // restart_delay: 10000,
        }
    ]
}