前言
nestjs配置方法有很多,比如用.env文件,yml文件,但是对我来说这都不是最优方案,命名空间我觉得是最优雅的方案,我会给大家介绍一下这种方案,相信大家会喜欢上的。这里把几种方案说下,着重给大家介绍命名空间的方案。
环境配置
.env文件
我们最常见的就是在.env文件里面去配置我们的环境变量,关于.env文件的原理也可以和大家讲讲,它是利用dotenv 这个库,这个库是零依赖的,他会读取.env文件里面的内容,然后将其序列化的挂载到process.env上面,这样就能访问到环境变量
比如我们用nestjs配置prisma的时候,我们在生成prisma客户端的时候,会给我们生成一个.env文件,里面有数据库的连接地址
这样看着很方便,但是要注意,如果我们项目配置都行比较多,全都塞到一个.env文件里面那不用说看着都难受
以下是.env文件的缺点
- 缺乏层次结构和类型检查:
.env
文件是一个简单的键值对文件,不支持复杂的层次结构和数据类型。这意味着在.env
文件中无法定义嵌套结构、数组或其他复杂类型的数据。这可能导致配置变得混乱,特别是对于大型应用程序或需要复杂配置的情况。 - 文件管理和部署复杂性: 当应用程序需要多个环境(例如开发、测试和生产环境)时,需要管理多个
.env
文件。这可能会导致文件管理和部署过程变得复杂和容易出错。同时,不同环境之间的配置差异可能导致问题,例如在将应用程序从开发环境切换到生产环境时可能会遗漏某些配置。 - 缺乏注释和文档支持:
.env
文件没有内置的注释功能,因此很难在文件中添加说明和文档来解释每个配置项的作用和用法。这可能导致团队成员之间的沟通困难,特别是对于新加入的开发人员来说。
.yml文件
在.yml文件里面我们就可以写嵌套的数据了,弥补了.env的不足。我们看看nestjs中如何配置它
config.yml
db:
mysql1:
host: 127.0.0.1
name: mysql1-dev
port: 3306
mysql2:
host: 127.0.0.1
name: mysql2-dev
port: 3306
首先我们写了一个config.yml文件,然后我在configuration.ts里面用configModule 的load 方法注入进去
这样我们可以编写多个yml文件,然后统一在configuration.ts整合,然后注入到环境变量里面。虽然这样写已经能满足我们的需求了,但是yml文件也是有许多限制的。
- 缺乏严格的语法: YAML语法相对灵活,同一份配置文件可以有多种有效的表示方式。这种灵活性有时可能导致配置文件的可读性和一致性下降。不同的人可能会以不同的方式编写和解释
.yml
文件,这可能导致配置错误或混淆。 - 敏感字符处理: YAML在处理某些特殊字符时可能会导致问题。例如,当配置项的值包含特殊字符(如冒号、大括号或引号)时,需要使用引号或转义字符进行处理。这可能会增加配置的复杂性,并且容易出错。
- 缺乏类型检查: YAML不提供强制的类型检查,配置项的数据类型不会得到验证。可能导致在使用配置数据时出现错误,特别是在需要特定类型的数据(例如数字或布尔值)时。
- 缺乏标准化和扩展性: YAML没有严格的标准化规范,不同的实现可能有一些差异。此外,在某些情况下,
.yml
文件可能无法满足复杂配置需求,特别是当配置文件需要支持更高级的功能,如变量替换、条件语句或循环等。
因为这些问题,我去了解到了一种命名空间的用法,可以完美解决上述问题。
命名空间
在说这个之前,我们先来说下上面那个configModule是啥, 在nestjs中给我们提供了一个可以去处理环境变量的module,
我们需要安装这个依赖 @nestjs/config
,这个包暴露出来的 configModule 以及configService 可以供我们非常方便的操作环境变量,它的原理也是利用dotenv来做的,我们今天讲的东西重点不在这里,就不细说了。
命名空间
字如其名,就是我们开辟一片独立空间,然后给它命名,里面的变量相互不影响,而且还是用ts编写,爽的一批 来看看用法
在前面一篇文章我在掘金学到的第一个项目开源了 - 掘金 (juejin.cn)提到的项目里面,我就用了命名空间来管理文件,环境配置
在config目录下面,写了对应文件的环境变量配置
默认会暴露出一个函数给到外面, 接着在index.ts里面集中管理这些配置项
然后跟上面yaml文件一样,我们在configModule的load函数里面加载进去
对于configModule这种最好做成全局模块,然后其他模块也不需要在import引入了,直接就可以用它的方法来访问
比如在我其中一个服务里面,就可以直接注入这个类,记得要从 @nestjs/config
这个包引入一下
要去访问这个环境变量我们直接用service身上的get方法就可以了,你也可以不用configService 去读,因为我们上面提到过configModule的原理,当我们load加载的时候,配置已经加载到process.env身上了,我们当然也可以用这个来获取。
总结
nestjs里面配置还是很方便的,对于这种环境配置,我是很推荐大家用第三种,非常方便好用。
最后觉得不错的话,来个小小的赞😀吧!