configuration - Nestjs ConfigModule:在配置对象中设置/覆盖值
问题描述
我ConfigModule
用来获取配置,使用自定义load
:
ConfigModule.forRoot({
isGlobal: true,
load: [defaultConfig]
}),
在我的defaultConfig
设置中,如果默认值丢失.env
和/或以其他方式修改值:
export const defaultConfig = () => {
return {
URL_PREFIX: process.env.URL_PREFIX || 'http://localhost:3000',
MICROSERVICE_URL: process.env.MICROSERVICE_URL + '/api/full/path',
// .... other values
};
};
问题是,当我想从中获取例如MICROSERVICE_URL
时,ConfigService
我只得到文件中设置的原始值.env
,而不是函数中设置/修改的完整路径的值defaultConfig
:
constructor(config: ConfigService) {
this.API_URL = config.get(`MICROSERVICE_URL`);
}
我做错了什么还是ConfigModule
没有覆盖已经设置的变量,我应该使用其他变量来存储更改的值?例如在defaultConfig
:
MICROSERVICE_URL_FULL: process.env.MICROSERVICE_URL + '/api/full/path',
这是我目前的解决方案,但是它引入了许多并不是真正必要的新变量,恕我直言。
解决方案
这种行为的主要原因是,如果值与ENV中提到的名称相同,则Nestjs 的 ConfigService不会覆盖这些值。
而且,我赞成创建一个新变量,因为在这个新变量中您甚至可以使用数据类型,我的意思是,您可以更改env 变量的数据类型和格式并将其存储在您的代码中,以防万一PORT 值,如果你直接从 env 读取它返回字符串(这对于 Express 开始是可以的)但是如果是布尔变量,它需要是布尔值,否则我们最终会做BOOL_VAR === "false"或其他,我觉得这是一个非常丑陋的代码。
我做了什么
创建了一个文件,该文件返回一个函数,该函数具有来自 ENV 的格式化值,并且也在 Grouped fromat 中,例如:
ConfigLoader.js(或 ts)
export default () => ({
// SYSTEM LEVEL CONFIG
SYSTEM: {
PORT: parseInt(process.env.PORT, 10) || 3000,
NODE_ENV: process.env.NODE_ENV || 'development',
SOME_BOOLEAN: JSON.parse(process.env.ANY_BOOLEAN_VAR) || true
},
});
并将其传递给加载属性中的 ConfigModule 。
笔记:
- ENV中的变量不能分组,但是我们可以,比如:ConfgiLoader.js(or ts)
- 我也处理了默认值,如果不通过PORT将取值 3000
- 而 NODE_ENV 将取值“发展”
- 另外,我将端口属性更改为比字符串更好的 Number(Int)
- 此外,布尔值也更改为布尔类型。
谢谢快乐编码:)
推荐阅读
- google-api - 安装工作空间市场应用程序后如何判断用户是否是 G Suite 域的管理员?
- java - Gradle 将哪些文件打包到 jar 存档中?
- xcode - 当我调用 swiftUI 视图时,Xcode SwiftUI 与 ViewController 混合,导航栏出现带有后退按钮,单击后如何将其删除
- ffmpeg - FFmpeg - 捕获一个 rtsp 流并将其重新流式传输到另一个 rtsp-server
- .net - HttpListener 认证
- css - CSS仅更改表格中没有i列的一行的属性
- delphi - 将字符串填充到固定列宽
- laravel - 如何将参数传递给模拟类构造函数
- opencv - 如何将 System.drawing.pointF 转换为 OpenCvSharp.Point
- javascript - 显示 Map 中的数组元素