Skip to main content

3 posts tagged with "nestjs/config"

View All Tags

· 4 min read
Zhouxiaoxiao

开始

随着工程越来越复杂,需要的配置项也越来越复杂,之前的配置方式也会在维护的时候产生麻烦,本篇文章将介绍使用yaml文件对工程配置项进行管理。

提示

这里假定你已经建立一个 Nestjs 工程,如果没有请执行如下命令:

nest new config-yml

首先我们需要安装几个插件,可以使用下面的命令进行安装。

pnpm add js-yaml  解析yml文件
pnpm add @types/js-yaml -D 解析yml文件
pnpm add cross-env 解析命令行环境变量
pnpm add lodash

新增 config.yml 文件

src同级别目录下新建目录 config,并新建三个文件,config.yml config.development.yml config.production.yml,三个文件内容如下:

config.yml
db:
mysql1:
dbType: mysql
dbUrl: http://localhost
dbPort: 3306
dbUser: root
mysql2:
dbType: mysql
dbUrl: http://localhost
dbPort: 3306
dbUser: root
config.development.yml
db:
mysql1:
dbName: mysql1-dev1
dbPwd: pwd-dev1
mysql2:
dbName: mysql1-dev2
dbPwd: pwd-dev2
config.production.yml
db:
mysql1:
dbName: mysql1-prod1
dbPwd: pwd-prod1
mysql2:
dbName: mysql1-prod2
dbPwd: pwd-prod2

在启动命令中设置环境变量

修改package.json,在启动命令上添加环境变量 cross-env NODE_ENV 参数

...
"start:dev": "cross-env NODE_ENV=development nest start --watch",
"start:debug": "nest start --debug --watch",
"start:prod": "cross-env NODE_ENV=production node dist/main",
...

配置文件读取

src目录下新建configuration.ts文件,用以根据环境变量读取对应环境的配置信息

configuration.ts
import { readFileSync } from "fs";
import * as yaml from "js-yaml";
import { join } from "path";
import * as _ from "lodash";

// 公共配置文件名称
const YML_COMMON_CONFIG_FILENAME = "config.yml";
// 公共配置文件路径
const filePath = join(__dirname, "../config", YML_COMMON_CONFIG_FILENAME);
// 各个环境配置文件路径
const envPath = join(
__dirname,
"../config",
`config.${process.env.NODE_ENV || `development`}.yml`
);
//读取公共配置内容,并使用yml进行加载
const commonConfig = yaml.load(readFileSync(filePath, "utf8"));
//读取各个环境配置内容
const envConfig = yaml.load(readFileSync(envPath, "utf8"));

export default () => {
//讲读取的配置文件内容进行合并返回
return _.merge(commonConfig, envConfig);
};

配置文件内容获取完后,我们需要在app.module.ts中对configuration.ts进行加载

app.module.ts
import { Module } from "@nestjs/common";
import { AppController } from "./app.controller";
import { AppService } from "./app.service";
import { ConfigModule } from "@nestjs/config";
import configuration from "./configuration";

@Module({
imports: [
ConfigModule.forRoot({
isGlobal: true,
load: [configuration],
}),
],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}

修改 API /config

app.controller.ts中修改 API /config

app.controller.ts
import { Controller, Get } from "@nestjs/common";
import { ConfigService } from "@nestjs/config";

@Controller()
export class AppController {
constructor(private readonly configService: ConfigService) {}

@Get("config")
getConfig(): any {
const config = this.configService.get("db");
return config;
}
}

接着你就可以使用不同的启动命令 pnpm start:dev 或者 pnpm start:prod ,访问 API 接口http://localhost:3000/config,就可以得到不同环境的配置信息了。

总结

我们完成了使用 yml 文件对不同环境不同配置项的读取,并且统一管理公共配置项。那么此次对 yml 的配置管理就介绍完了!

源码

源码可以参考这里config-yml

· 4 min read
Zhouxiaoxiao

开始

提示

请先阅读前序章节,本文代码依赖前序章节,Nestjs 通用配置-基础配置

在我们开发过程中一般至少会有开发环境和正式环境,两个环境的配置项虽然相同但是配置值会存在不一样,这个时候就需要我们按照不同的环境进行不同的配置。

新建配置文件

先在.env文件同级目录下新建两个文件,拷贝.env内容到两个新文件:

.env.development
.env.production

修改三个文件中的DB_NAME的值,分别添加后缀 -dev -prod

DB_NAME=mydemo-dev
DB_NAME=mydemo-prod

在启动命令中设置环境变量

我们需要增加corss-env插件,我们就可以在启动命令行上增加环境变量传递给应用程序

pnpm add cross-env -D

修改package.json,在启动命令上添加环境变量 cross-env NODE_ENV 参数

"start:dev": "cross-env NODE_ENV=development nest start --watch",
"start:debug": "nest start --debug --watch",
"start:prod": "cross-env NODE_ENV=production node dist/main",

配置文件读取

修改app.module.ts,引入环境变量,并在 ConfigModule 参数里面引入环境变量

app.module.ts
import { Module } from "@nestjs/common";
import { AppController } from "./app.controller";
import { AppService } from "./app.service";
import { ConfigModule } from "@nestjs/config";

const envFilePath = `.env.${process.env.NODE_ENV || `development`}`;

@Module({
imports: [
ConfigModule.forRoot({
isGlobal: true,
envFilePath: envFilePath,
}),
],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}

接着你就可以使用不同的启动命令 pnpm start:dev 或者 pnpm start:prod ,访问 API 接口http://localhost:3000/config,就可以得到不同环境的配置信息了。

抽离公共配置项

这样的配置可以满足 90%的 Nestjs 的配置需求了,但是会存在配置项冗余的问题,比如我们的新建的两个文件里面就冗余了配置项 DB_TYPE=MYSQL, 我们的例子里面只有数据库的配置项,如果项目的配置项很多,就会冗余非常多的配置,维护起来就非常麻烦。接下来我们解决这个问题。

我们要利用之前的.env配置文件,只在.env配置文件中配置DB_TYPE=MYSQL,其余配置文件删除DB_TYPE=MYSQL配置项。

先安装插件dotenv

pnpm add dotenv

app.module.ts中修改 ConfigModule 参数,给load赋值,指定读取.env配置文件

app.module.ts
import { Module } from "@nestjs/common";
import { AppController } from "./app.controller";
import { AppService } from "./app.service";
import { ConfigModule } from "@nestjs/config";
import * as dotenv from "dotenv";

const envFilePath = `.env.${process.env.NODE_ENV || `development`}`;

@Module({
imports: [
ConfigModule.forRoot({
isGlobal: true,
envFilePath: envFilePath,
load: [() => dotenv.config({ path: ".env" })],
}),
],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}

总结

我们完成了对不同环境不同配置项的读取,并且统一管理公共配置项。那么此次对配置管理就介绍完了!

源码

源码可以参考这里config-demo

· 3 min read
Zhouxiaoxiao

开始

通常我们建立后台应用程序的时候,是需要提前配置一些工程参数,例如数据库地址\用户名密码,redis 地址\密码等等,本篇文章将介绍如何通过@nestjs/config进行参数配置。

提示

这里假定你已经建立一个 Nestjs 工程,如果没有请执行如下命令:

nest new config-demo

进入工程目录,执行命令,安装@nestjs/config:

pnpm add @nestjs/config

新增配置文件

安装完成后,我们在和package.json同级别的目录上新建.env文件

.env
DB_TYPE=MYSQL
DB_NAME=mydemo
DB_URL=http://localhost:3306
DB_USER=root
DB_PWD=root

配置导入

同时我们修改app.module.ts文件,引入ConfigModule,并将isGlobal设置为true,让ConfigModule可以全局使用。

app.module.ts
import { Module } from "@nestjs/common";
import { AppController } from "./app.controller";
import { AppService } from "./app.service";
import { ConfigModule } from "@nestjs/config";

@Module({
imports: [
ConfigModule.forRoot({
isGlobal: true,
}),
],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}

接下来我们修改app.controller.ts,并在构造函数中引入ConfigService,我们新增一个 API,在 API 里面解析出.env里面的参数并将参数返回。

app.controller.ts
import { Controller, Get } from "@nestjs/common";
import { AppService } from "./app.service";
import { ConfigService } from "@nestjs/config";

@Controller()
export class AppController {
constructor(
private readonly appService: AppService,
private readonly configService: ConfigService
) {}

@Get("config")
getConfig(): any {
const config = {
dbType: this.configService.get("DB_TYPE"),
dbName: this.configService.get("DB_NAME"),
dbUrl: this.configService.get("DB_URL"),
dbUser: this.configService.get("DB_USER"),
dbPwd: this.configService.get("DB_PWD"),
};
return config;
}
}

启动应用程序,并请求 API 接口http://localhost:3000/config, 得到数据配置信息。至此@nestjs/config的基本使用介绍完毕。

{
"dbType": "MYSQL",
"dbName": "mydemo",
"dbUrl": "http://localhost:3306",
"dbUser": "root",
"dbPwd": "root"
}

总结

我们通过上述操作,完成了以下任务:

1、引入配置文件并读取配置文件。
2、新增接口config,返回所配置内容。

下一节我们将介绍 Nestjs 配置的进阶用法。