zoukankan      html  css  js  c++  java
  • Expressjs配置加载器

    有些东西就是操刀开干,没什么好解释的....

    问题引入

    大家都知道在日常的研发过程中,我们的程序会有多套环境的运行情况,每套环境都会有相应的配置,比如数据库相应的配置在研发、测试、生产环境上一般都是不同的,如果大家在提测或上线前还需要临时来变更这些配置,说明框架层面还不完善,而且这样也很容易造成失误,Web程序这种失误还能勉强在短时间内修复,如果是Native的app,那就麻烦了...

    使用过PHP的CodeIgniter的都知道,在该框架下的config文件夹下会自带2个文件夹

    而ci框架本身提供配置加载函数,$this->config->load('filename'); 该函数针对当前程序运行的不同环境会加载不同环境下的配置。

    目前在Nodejs的Expressjs生态中,这样的功能也有类似存在,比如confenvenvconfik,总体都不满足我们的需求。

    解决问题

    为了解决这个问题,我们还是自己简单快速造一个,其实不管怎么写代码都非常少,在构思的时候主要有两个思路

    1. 使用middleware的方式
    2. 使用global的方式

    经过简单的思考,还是觉得采用global的方式,因为并非所有需要配置的场景都只是在req上边,可能在某个helper里边我需要使用配置文件。

    直接上码

    这里

    主要有两个模块,一个跟环境相关,另一个跟配置文件相关

    env.js

    该模块提供三个方法

    1. init()
    2. get()
    3. set(env)

    从函数名就能轻易看出

    1. init() 函数为初始化整个Nodejs进程执行的环境,其实就是指定process.env.NODE_ENV,跟export NODE_ENV='xxx'效果类似,只不过有部分限制和安全检查。该函数会在程序入口被调用。该函数在初始化为preview的时候有不具备通用性,这是因为当前公司的上限平台限制。
    2. get() 获取当前Nodejs执行的环境。
    3. set(env) 设置当前Nodejs执行环境,有一些安全限制,比如生产环境下不允许设置为其他环境。

    代码在这里

    index.js

    该模块主要有3个方法,

    1. EnvConf 构造函数,需要传递config的根目录。
    2. init(configBaseDir) 该函数用于初始化特定环境配置所需要的工作比如环境重置、文件检测和创建。
    3. _load() 该方法为内部方法,但是会装载到global.$loadConf上,最终暴露出来的为$loadConf('configFileName')

    并且将env.js模块导出。

    代码在这里

    使用方法

    初始化

    在程序的入口处执行一个init函数即可

    1. npm install
    2. 在根目录下创建developmenttestpreviewproduction四个文件夹。根据需要不一定需要全有。
    3. 在程序的入口处,比如app.js,引入包import { EnvConf } from 'mfe-node-env-conf'
    4. 同时调用初始化new EnvConf(config.root).init()

    如 app.js

    import './logger'
    import 'babel-polyfill'
    import logger from 'mfe-logger'
    import couponsBatchCtrl from './app/controllers/coupons-batch'
    
    import { EnvConf } from 'mfe-node-env-conf'
    new EnvConf(config.root).init()
    
    process.on('uncaughtException', function (err) {
      logger.error(err)
    })
    
    const app = express()
    const router = express.Router()
    

    使用方法

    router.use('/test', (req, res) => {
      const env = $loadConf('env.js')
      res.json(env)
    })
    

    这样就直接OK了。

    写在最后

    总体感觉这个东西还是比较简单,自己撸完码,再写个文档,同时往Github上一丢,还是挺舒爽的,还是那句话知易行难,编程这条漫漫路没有捷径,就是需要从一点点的实战中积累,总结和思考。

  • 相关阅读:
    动手篇:简易的首页登陆界面
    情感交流篇:HTML页面如何与后端联系
    MD5加密处理
    处女篇:自用C#后端SqlHelper.cs类
    动手篇:简单的注册界面与防SQL注入(续)
    十二省联考2019 字符串问题
    PKUWC2020游记
    uoj435 Simple Tree
    CF1303G Sum of Prefix Sums
    AGC069F Flags
  • 原文地址:https://www.cnblogs.com/liujb/p/Expressjs-pei-zhi-jia-zai-qi.html
Copyright © 2011-2022 走看看