nestjs 配置管理简单说明
nestjs 配置管理是一个独立的模块,机制上不像midwayjs的玩法,直接提供了装饰器可以快速获取,但是nestjs 是以模块的模式提供的,同时支持范型模式,当然有支持midwayjs 接口定义获取的模式(自动进行对象转换),以下是一个简单玩法
基于yaml的简单实例
内容实际来自官方文档,我做了一些简单调整,使用了多模块的模式
- 配置
http:
host: "localhost"
port: 8080
db:
postgres:
host: "localhost"
port: 5432
database: "mydb"
username: "user"
password: "password"
sqlite:
database: "db.sqlite"
- 宿主应该暴露全局配置模块
imports: [
ConfigModule.forRoot({
isGlobal: true, // 此处注册为了全局模块,子模块就可以直接通过ConfigService 获取了
load: [configuration],
}),
configuration 定义
import { readFileSync } from 'fs';
import { join } from 'path';
import * as yaml from 'js-yaml';
const YAML_CONFIG_FILENAME = 'app.yaml';
export default () => {
const filePath = join(__dirname, '..', 'conf', YAML_CONFIG_FILENAME);
const file = readFileSync(filePath, 'utf8');
const config = yaml.load(file) as Record<string, any>;
return config;
};
- 子模块通过ConfigService 获取实体数据
接口类型定义,可以让ConfigService 自动帮助我们进行对象处理
export interface PGDBConfig {
host: string;
port: number;
username: string;
password: string;
database: string;
}
export interface HttpConfig {
host: string;
port: number;
}
export interface SQLiteDBConfig {
database: string;
}
export interface AppConfig {
http: HttpConfig;
db: {
postgres: PGDBConfig;
sqlite: SQLiteDBConfig;
};
}
使用配置(注意不太好的是暂时没有提供直接获取所有的,对于配置是基于字符串格式获取的)
import { Controller, Get } from '@nestjs/common';
import { ModuleBService } from './moduleb.service';
import {ConfigService} from "@nestjs/config"
import type {PGDBConfig} from "./config"
@Controller("mb")
export class ModuleBController {
constructor(private readonly moduleBService: ModuleBService, private readonly configService: ConfigService) {}
@Get("/")
getHello(): string {
const query = this.configService.get<PGDBConfig>('db.postgres');
return `Host: ${JSON.stringify(query)}, Message: ${this.moduleBService.getHello()}`;
}
}
说明
从使用上midwayjs 的似乎是是挺不错的实践,但是nestjs 比较符合nestjs 的模块,服务,ioc 的套路,同时注入配置注册为全局,我们的子模块使用也是很不错的,官方文档很值得看看
浙公网安备 33010602011771号