节点JS永远加载dotenv

时间:2017-09-19 06:31:14

标签: node.js express forever

我想问一下是否有人知道如何永久运行可以加载.env文件。

目前,如果我们永远运行启动app.js,则process.env.foo将变为未定义。

7 个答案:

答案 0 :(得分:1)

TLDR 在底部。

以前有很多答案,但没有一个能真正解决这个特定用例。

要使用 forever 运行 dotenv,您需要做两件事。

首先我们需要使用 dotenv 的 preload 特性,这意味着我们需要永远向进程传递一个节点参数。我们可以通过使用 -c COMMAND 标志永远拥有。

第二件事与 dotenv 包的工作方式有关。这是源代码的片段:

  let dotenvPath = path.resolve(process.cwd(), '.env')

process.cwd() 有什么作用?

<块引用>

process.cwd() 方法是 process 模块的内置应用程序编程接口,用于获取 node.js 进程的当前工作目录。

意思是 dovenv 包要从工作目录加载 .env 文件。所以为了解决这个问题,我们可以使用forever的--workingDir标志来指定进程的实际工作目录。

最后的命令看起来像这样:(TLDR 从这里开始)

forever -c "node -r dotenv/config" --workingDir app-workdir-path start app.js

其中 app-workdir-path 是项目目录的绝对路径。

答案 1 :(得分:0)

您可以使用dotenv包来实现此目的。在您的应用输入上,执行此操作

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

答案 2 :(得分:0)

如果您在项目的根目录中添加了.env文件,那么您可以这样使用 require('dotenv').config()

或者,如果您使用不同的位置创建了文件.env,那么请在您的代码中使用 require('dotenv').config({path : '/your/path/.env'})

答案 3 :(得分:0)

我找到了您的问题,并且遇到了同样的问题。我认为dotenv不会永远有效-至少不是我能够开始工作。但是,我认为您可以采用一种解决方法。我能够在forever命令之前的命令行上指定环境变量,并将这些环境变量永远传递给我的节点应用程序。

~$ ENV=production forever start yourApp.js

有关在命令行上指定环境变量的更多信息,请检查此Stack Overflow question

答案 4 :(得分:0)

我在多服务器永久配置中遇到了这个问题。

如果在根目录中包含--workingDir文件并使用dotenv

,则应包含指向项目目录根目录的.env参数

示例:

  • 具有最小“硬编码”值的灵活配置
  • .env放在根目录中
  • “ dotenv”以dotenv.config()的形式使用

如果是一台服务器,则用于多服务器配置的代码:

const fs = require('fs');
const path = require('path');

let foreverConfig = [
  {
    uid: 'scheduledJobsServer',
    append: true,
    watch: true,
    script: 'scheduledJobsServer.js',
    sourceDir: path.join(__dirname, '/server'),
    workingDir: path.join(__dirname)
  },
  {
    uid: 'mainServer',
    append: true,
    watch: true,
    script: 'server.js',
    sourceDir: path.join(__dirname, '/server'),
    workingDir: path.join(__dirname)
  }
];

try {
  fs.writeFileSync(
    path.join(__dirname, '/foreverConfig.json'),
    JSON.stringify(foreverConfig),
    { encoding: 'utf8' }
  );
  let consoleMessage = 'Init script success';
  console.log('\x1b[42m%s\x1b[0m', consoleMessage);
} catch (e) {
  console.log('Init script error:', e);
  process.exit(1);
}

然后运行forever start foreverConfig.json

答案 5 :(得分:0)

对我有用的是指定完整路径:

require('dotenv').config({ path: '/opt/api/.env' });

答案 6 :(得分:0)

有时您必须从另一个目录调用节点脚本。例如,在运行cron作业时。这是您可以做的:

cd /path/to/script/ && /usr/bin/forever start /usr/bin/node script.js

现在将加载.env文件。