在节点配置之前使用 dotenv 加载环境变量

Load ENV vars with dotenv before node-config

我想将环境变量加载到我的 Express 应用程序的常规 config 中。我在本地使用 .env 文件,但在部署时,我会将环境变量注入 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 中看到变量,但它们不会被 custom-environment-variables.json 中的 config 加载。 F.e。 nodeEnvporthostname 变量被加载。但是它们是在应用程序启动之前加载到容器中的。

这让我想到 configdotenv 模块设法从 .env 文件加载值之前加载。从本质上讲,问题似乎只存在于 DEV env 中,因为这是我从 .env 文件加载环境变量的唯一地方。对于任何其他环境,它们甚至会在应用程序启动之前就存在于容器环境中。

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

有什么实现方法的建议吗?

最终我选择了本地环境变量的外部加载,以及节点进程启动:

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

灵感来自