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

Mil*_*iez 6 environment-variables node.js express node-config dotenv

config我想将环境变量加载到我的 Express 应用程序的常规中。在本地,我使用一个.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"
  }
Run Code Online (Sandbox Code Playgroud)

以及.env我项目的根目录中的一个文件。

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

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

console.log(process.env);
console.log(config);
Run Code Online (Sandbox Code Playgroud)

我还尝试将它们按正常顺序排列:

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

dotenv.config();
Run Code Online (Sandbox Code Playgroud)

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

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

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

const app = new App();
export app;
Run Code Online (Sandbox Code Playgroud)

然后在index.ts

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

console.log(config);

// app.use() and other inits
app.listen(...);
Run Code Online (Sandbox Code Playgroud)

但无济于事。文件.env已加载,我可以看到 in 中的变量process.env,但它们不会被configin加载custom-environment-variables.json。FenodeEnvport变量hostname已加载。但它们是在应用程序启动之前加载到容器中的。

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

我可以强制重新加载吗config

有什么建议如何实现这一目标吗?

Mil*_*iez 4

最终我决定在节点进程启动的同时外部加载本地环境变量:

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

灵感就来自这里