少配置文件
首先安装一个依赖 @nest/config用于自动读取配置文件
接着在根目录下创建.env文件 我们简单配置一下用例APP_NAME
接着在app.module.ts中引入ConfigModule,它的内部向外暴露的forRoot工厂函数用于我们来读取配置项, isGlobal熟悉模块应该知道,给它全局使用
接着在app.controller.ts中我们来使用一下
这样我们就读到了环境变量
还有一种方式,在node中我们还可以利用process.env来获取环境变量
x`
一个注意点!!!
如果我们把项目开源,提交到仓库时,一定要注意,如果有阿里云密钥或者类似APP_SCRECT这样的密钥,提交时一定要在.gitignore文件中加上.env文件,防止泄露
多文件配置
一般写法
当我们的环境变量有很多种类有不同,类似数据库,文件格式等等,这个时候我们可以用模块化的思想把它们提取到不同文件中,最后再统一导出
我们创建了一个app.config.ts里面定义了不同种类的环境变量,在ConfigModule的load配置项中引入,它可以将我们创建的config.ts模块与.env文件结合
我们发现这样也是可以的,但是有个弊端就是每个环境变量都放在一个文件里里面,不好管理。
我们可以提取不同到的文件中
在src下面创建一个config文件夹专门存放配置文件,最后由index.ts导出
接下来在app.module中重新导入,注意需要用到展开语法
到这一步其实已经实现了所有功能,但是没有类型提示,我们又引申出了命名空间的方式
命名空间
创建了一个database.config,将其在index.ts中导出
注意命名空间这种写法在ConfigModule中处理方式不一样,他的处理就像这样
所以我们在controller中用的时候要用依赖注入的方式,注意这里的@Inject()里面的写法是匹配到key 也就'database'
到这里也是基本完成了,但是我们注意到我这里database类型是any
接下来就是类型提示的问题了
两种类型提示方式
第一种用ts手写实现
type getType<T extends () => any> = T extends () => infer U ? U : T; type k = typeof databaseConfig; type databaseType = getType<k>;
第二种用config包自带的功能
两种方式都可以实现类型提示
写在最后
关于两种配置方式,一般来说在.env文件里面配置这些已经足够了,不过这种模块化的思想还是值得学习的,里面有一些细节需要注意,希望能帮到大家!