在spring boot的项目中,我们可以根据 spring.profiles.active参数设置当前启用的配置文件。这样,我们可以很方便的切换环境。
于是在Koa项目中,我们也模仿srping boot写一个配置文件加载的函数。
1.设计好目录结构
参考maven项目,配置文件的文件夹名称 resources,项目代码目录 server (这是一个nextjs项目,否则命名src会更好)
2.读取配置文件
在server文件夹下,创建 bootstrap文件夹,存放一些启动时需要加载的文件。配置文件读取类AppConfig 也放这里。
import _ from "lodash"; import args from "yargs"; import yaml from "js-yaml"; import fs from "fs"; const argv = args.argv; const resources = __dirname+"/../../resources"; class AppConfig { public static instance : AppConfig ; private data : any = null; constructor() { this.loadConfig(); } public static getInstance(){ if(!this.instance){ this.instance = new AppConfig(); } return this.instance; } private loadConfig(){ const env = _.get(process.env,"profiles.active") || argv.env; if( env ){ let applicationJson = yaml.safeLoad(fs.readFileSync(resources+"/application"+(env?("-"+env):"")+".yaml","utf-8")); this.data = _.assign({},process.env,applicationJson); }else { let applicationJson = yaml.safeLoad(fs.readFileSync(resources+"/application.yaml","utf-8")); this.data = _.assign({},process.env,applicationJson); const active = _.get(this.data,"profiles.active"); if( active ){ let applicationActiveJson = yaml.safeLoad(fs.readFileSync(resources+"/application-"+active+".yaml","utf-8")); this.data = _.assign({},this.data,applicationActiveJson) } } } get(key:string){ return _.get(this.data,key); } } export default AppConfig.getInstance()
3.设置当前配置文件
由代码可见,在环境变量没有读取到profiles.active 的时候,回去读取 application.yml文件,如果其中有对应的profiles.active变量,则会去读取相应的配置文件。
4.使用配置文件
只需要improt这个类,需要的地方,直接 调用get即可
import config from "./bootstrap/AppConfig"; config.get("service-api.proxy-target")