在节点配置之前用dotenv加载ENV变量

时间:2019-11-18 09:30:53

标签: node.js express environment-variables dotenv node-config

我想将环境变量加载到Express应用程序的常规config中。我在本地使用.env文件,但是在部署时,我会将env vars注入docker容器中。

因此,我有一个带有一些硬编码配置值的default.json。然后,我得到了custom-environment-variables.json文件,如下所示:

  "app": {
    "nodeEnv": "NODE_ENV",
    "port": "PORT",
    "hostname": "HOSTNAME"
  }
  "mongoDb": {
    "connectionString": "MONGODB_CONNECTION_STRING"
  },
  "redis": {
    "connectionString": "REDIS_CONNECTION_STRING"
  },
  "logDna": {
    "key": "LOGDNA_KEY"
  }

和我项目的根目录下的.env文件。

在服务器启动文件中,我有:

import * as dotenv from 'dotenv';
dotenv.config();
import * as config from 'config';

console.log(process.env);
console.log(config);

我还尝试过按正常顺序放置它们:

import * as config from 'config';
import * as dotenv from 'dotenv';

dotenv.config();

我尝试的另一件事是将应用程序声明与服务初始化和应用程序启动分开。在app.ts中是这样的:

import * as App from 'express';
import * as dotenv from 'dotenv';

dotenv.config();
console.log(process.env);

const app = new App();
export app;

然后在index.ts中输入:

import app from './app';
import * as config from 'config';

console.log(config);

// app.use() and other inits
app.listen(...);

但无济于事。 .env文件已加载,我可以在process.env中看到var,但是config中的custom-environment-variables.json无法加载它们。 F.e. nodeEnvporthostname变量已加载。但是它们是在应用程序启动之前加载到容器中的。

这使我想到在config模块设法从dotenv文件加载值之前先加载.env。从本质上讲,似乎该问题只会在DEV env中存在,因为这是我将从.env文件加载环境变量的唯一位置。对于任何其他环境,它们甚至会在应用启动之前出现在容器环境中。

我可以强制重新加载config吗?

任何建议如何实现这一目标?

1 个答案:

答案 0 :(得分:0)

最终,我决定与节点进程启动一起在外部加载本地环境变量:

node --require=dotenv/config src/index.js

来自here的灵感。