首页 > 解决方案 > 在节点配置之前使用 dotenv 加载 ENV 变量

问题描述

我想将环境变量加载到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"
  }

.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文件已加载,我可以看到 in 的 vars ,process.env但它们没有被configin加载custom-environment-variables.json。铁nodeEnv和变量被加载porthostname但是它们在应用程序启动之前被加载到容器中。

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

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

有什么建议可以实现吗?

标签: node.jsexpressenvironment-variablesdotenvnode-config

解决方案


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

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

灵感来自这里


推荐阅读