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 变量注入到脚本的进程中
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)
你先杀了你 pm2 进程
尝试
pm2 kill
Run Code Online (Sandbox Code Playgroud)
然后使用重新启动pm2
pm2 start app.js
Run Code Online (Sandbox Code Playgroud)