用nestjs开发一个博客应用之程序配置

1.应用程序很多时候的运行条件都跟配置息息相关,而在nest中使用配置进行开发也很方便,他被抽象为一个功能模块,因此可以被导入到其他模块中进行动态注入。在nest中关于配置的最佳实践可以搭配joi package一起使用,因为有的时候我们并不希望某个配置项为空或者不存在,那么便可以利用joi包对配置项目进行建模,以此达到一个更加完善的验证。(需要注意的是,对于每个配置属性,都必须有一个getter方法来取值)。相关用法如下所示:

2-1:先安装相关依赖包:

1
2
3
npm i --save dotenv; ## 键值对处理相关包,我们的配置文件是以键值对的形式出现的
npm i --save joi; ## 字段建模验证
npm i --save-dev @types/joi;

2-2:假设有配置问价如下所示:

1
2
3
DATABASE_NAME = BLOG
DATABASE_USER = YOU_NAME
DATABASE_PASSWORD = YOU_PASSWORD

2-3:创建这个module的service文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
// config.service.ts
import * as joi from 'joi';
import * as dotenv from 'dotenv';
import * as fs from 'fs';

// 定义一个具有任意属性的对象类型
export interface EnvConfig {
[Key: string]: string;
}

export class ConfigService {
private readonly envConfig: EnvConfig;

constructor(filePath: string) {
const config = dotenv.parse(fs.readFileSync(filePath)); // 读取配置文件,并利用dotenv进行解析
this.envConfig = this.validateInput(config); // 验证配置
}

private validateInput(envConfig: EnvConfig): EnvConfig {
const envSchema: joi.ObjectSchema = joi.object({
DATABASE_NAME: joi.string()
.valid(['blog', 'ablog'])
.default('blog'),
DATABASE_USER: joi.string()
.valid(['root', 'visitor'])
.default('root'),
DATABASE_PASSWORD: joi.number().required()
});
const { error, value: validateConfig } = joi.validate(envConfig, envSchema);
if (error) {
throw new Error(error);
}
return validateConfig
}

// 每一个配置属性都必须设置一个getter方法来获取值
get databaseName(): string {
return this.envConfig.DATABASE_NAME;
}

get databaseUser(): string {
return this.envConfig.DATABASE_USER;
}

get databasePassword(): string {
return this.envConfig.DATABASE_PASSWORD;
}
}

2-4:创建配置的module文件:

1
2
3
4
5
6
7
8
9
10
11
import { Module } from '@nestjs/common';
import { ConfigService } from './config.service';

@Module({
providers: [
provide: ConfigService,
useValue: new ConfigService(`${filePath}`)
],
exports: [ConfigService]
})
export class ConfigModule {}

2-5:到了上面这一步基本就已经完成了一个配置模块的功能编写,接下来介绍一下该怎么使用这个配置模块:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// app.module.ts
import { ConfigModule } from './config.module';
@Module({
imports: [ConfigModule]
})

// 在当前模块中引入了config模块之后,便能够进行使用了,如下所示:
// app.service.ts
import { Injectable } from '@nestjs/common';

@Injectable()
export class AppService {
private dataBaseName: string;
constructor(config: ConfigService) {
this.dataBaseName = config.databaseName;
}
}