首页 > 解决方案 > 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',

这是我目前的解决方案,但是它引入了许多并不是真正必要的新变量,恕我直言。

标签: configurationnestjs

解决方案


这种行为的主要原因是,如果值与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)
  • 此外,布尔值也更改为布尔类型。

谢谢快乐编码:)


推荐阅读