【发布时间】:2020-03-13 15:24:03
【问题描述】:
我想将环境变量加载到我的 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. nodeEnv、port 和 hostname 变量已加载。但它们是在应用程序启动之前加载到容器中的。
这让我想到config 在dotenv 模块设法从.env 文件加载值之前加载。从本质上讲,这个问题似乎只存在于 DEV 环境中,因为这是我从.env 文件加载环境变量的唯一地方。对于任何其他环境,它们甚至会在应用启动之前出现在容器环境中。
我可以强制重新加载config吗?
有什么建议可以实现吗?
【问题讨论】:
-
dotenv只会在process.env上公开这些变量,并且不会将它们注入到其他模块中,而不管顺序如何。理想情况下,dotenv.config();应该在应用程序启动后立即出现。你想从config模块中实现什么(但它们不会被 custom-environment-variables.json 中的配置加载)..config做了什么 -
@ambianBeing config env vars 基本上,它会找到与我在配置文件中声明的名称相同的环境变量并加载它们的值。
标签: node.js express environment-variables dotenv node-config