在NodeJS中使用配置文件,有几种比较不错的方案:
第一种:文件格式使用json是毋容置疑的好方案。格式标准,易于理解,文件内容读取到内存之后,使用JSON的标准分析函数即可得到配置项。
第二种:将配置文件做成模块。其内容格式完全可以整合成一个object,然后将其导出。在NodeJS中require引入后,可以直接访问配置项。
第三种:使用Ini格式或者类XML的配置文件。这样的配置文件后台开发司空见惯,格式清晰,也不失是一种比较好的方法。

由于最近一个项目需要在NodeJS中读取分析后台生成的类XML配置文件,所以凑周末时间写了一个简单层级配置文件的解析类。封装后发布到npmjs,供有需要的同学一起使用。01.简单层级配置文件格式

//定义主配置文件
<main>
<log>
filepath = /data/app/logs
filename = svrrequest.log
</log> //定义可用的服务端IP地址
<server>
<ipinfo>
host = 192.168.10.58
port = 28000
</ipinfo> <ipinfo>
host = 192.168.25.26
port = 14000
</ipinfo>
</server>
</main> //定义MySQL数据库访问用户和密码
<mysql>
user = admin
password = admin@*123456%
</mysql> //定义告警接收人邮件地址
email = motadou@126.com

02.使用方法 首先使用npm安装该配置文件解析模块:

npm install mo-configure

获取配置项的语法如下:

//第一步,引入配置文件解析类
var configure = require("mo-configure"); //第二步,创建一个配置文件解析类
var config = new configure(); //第三步,指定配置文件路径,或者传入配置文件的内容
//比如:
//config.parseText('<main>email=motadou@126.com</main>')
//config.get("main.email");
config.parseFile("main.conf"); //例子一: configure to json
//json为内置属性,该属性将配置文件内容转换成了JSON格式的数据
console.log(config.json); //例子二:有两种方法获取指定的配置项
//第一种直接访问内部的JSON结构,但这种方法有时会抛出异常,请注意捕捉
console.log(config.json.email);
console.log(config.json.main.log.filename); //第二种调用配置类的get函数,该函数当找不到配置项时,允许返回一个指定的默认值
console.log(config.get("email", "not define email"))
console.log(config.get("main.log.filename")); //例子三:返回一个JSON对象
var ipinfo = config.get("main.server.ipinfo");
console.log(ipinfo);

03.配置文件类的实现 源代码以及后续更新请参考Github项目:https://github.com/motadou/mo-configure.git
主要实现代码原理如下:

var fs = require("fs");

var configure = function () {
this._data = { }; this.__defineGetter__("json", function () { return this._data; });
} configure.prototype.parseText = function (sText) {
var arr = sText.split(/\r\n|\r|\n/); //行划分
var stack = [this._data]; for(var i = 0, len = arr.length; i < len; i++) {
var line = arr[i].replace(/^[\s\t ]+|[\s\t ]+$/g, '');
if (line.length == 0 || line[0] == "#") {
continue;
} //当前行为当前域下面的值
if (line[0] != "<") {
var options = line.split("=");
var key = options[0].replace(/^[\s\t ]+|[\s\t ]+$/g, '');
var value = options.length == 2?options[1].replace(/^[\s\t ]+|[\s\t ]+$/g, ''):undefined; stack[stack.length - 1][key] = value;
continue;
} //当前行为域的标识
if (line[line.length - 1] != '>') {
//域标识符有开头但没有结尾,则分析错误
this.data = {};
return false;
} //当前行为域的结束
if (line[1] == "/") {
stack.pop();
continue;
} //当前行为域的开始
var key = line.substring(1, line.length - 1);
var parent = stack[stack.length - 1]; if (parent.hasOwnProperty(key)) {
//在当前域中已经有相同名字的域
if (parent[key] instanceof Array) {
parent[key].push({});
} else {
parent[key] = [parent[key], {}];
}
stack.push(parent[key][parent[key].length - 1]);
} else {
parent[key] = {};
stack.push(parent[key]);
}
}
} configure.prototype.parseFile = function (sFilePath, encoding) {
var data = fs.readFileSync(sFilePath, encoding?encoding:"utf8"); this.parseText(data);
} configure.prototype.toJson = function() {
return this._data;
} configure.prototype.get = function (key, DEFAULT_VALUE) {
key = key.replace(/[\s\t ]+/g, '');
key = key.replace(/\.{2,}/g, '.'); var paths = key.split('.');
var parent = this._data;
for (var i = 0, len = paths.length; i < len; i++) {
if (!parent.hasOwnProperty(paths[i])){
return DEFAULT_VALUE;
} if (i == len - 1) {
return parent[paths[i]];
} parent = parent[paths[i]];
}
} module.exports = configure;

nodejs简单层级结构配置文件的更多相关文章

  1. Linux文件系统的层级结构

    Linux文件系统的层级结构   文件结构 倒置的树状结构 :Linux的哲学思想是一切皆文件,把几乎所有资源统统抽象为文件形式:包括硬件设备,甚至通信接口等 根目录 :linux的文件起始均从唯一的 ...

  2. fhs文件系统层级结构

    文件系统:操作系统用于明确存储设备或分区上的文件的方法和数据结构:层次化管理文件的结构就是文件系统: linux层次化文件结构,倒树状结构文件结构        FHS  filesystem hie ...

  3. 如何优化你的布局层级结构之RelativeLayout和LinearLayout及FrameLayout性能分析

    转载请注明出处:http://blog.csdn.net/hejjunlin/article/details/51159419 如何优化你的布局层级结构之RelativeLayout和LinearLa ...

  4. Powershell-查询当前文件目录层级结构

    日常工作中我们往往有需要导出当前共享环境或磁盘文件目录层级结构等的需求,最早在目录少的情况下我们使用CMD下tree 命令可以很清晰的看到目录.文件层级结构,那么我们又如何通过powershell直观 ...

  5. scala的多种集合的使用(1)之集合层级结构与分类

    一.在使用scala集合时有几个概念必须知道: 1.谓词是什么? 谓词就是一个方法,一个函数或者一个匿名函数,接受一个或多个函数,返回一个Boolean值. 例如:下面方法返回true或者false, ...

  6. 文件系统层级结构标准(FHS)

    参考资料:FHS 简介 FHS目前发展到3.0版本,发布于2015年6月3日,由Linux基金会在负责维护.它规定了Linux的文件层级结构,使得各Linux发行版.软件开发商知道应该将哪些文件放在哪 ...

  7. 前端(七)—— 盒模型之display、overflow、隐藏、border、margin、样式支持,层级结构

    display.overflow.隐藏.border.margin.样式支持,层级结构 一.盒模型之display 1.三种样式 block 块 inline 内联/行内 inline-block 内 ...

  8. 使用Python3.7+Django2.0.4配合vue.js2.0的组件递归来实现无限级分类(递归层级结构)

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_133 所谓的无限极分类是啥?其实简单点说就是一个人类可以繁衍出多个后代,然后一个后代又可以分另外多个后代这样无限繁衍下去(可以想象 ...

  9. iOS-获取UIView的全部层级结构

    在iOS中获取UIView的全部层级结构 应用场景 在实际 iOS 开发中,非常多时候都须要知道某个 UI 控件中包括哪些子控件,而且分清楚它们的层级结构和自个的 frame 以及 bounds ,以 ...

随机推荐

  1. The first day of HTML

    这是韩顺平老师的<轻松搞定网页设计(html.css.js)>,讲的还凑合,仅作入门.决定还是做好笔记,记录学习的过程,这是HTML的第一天. HTML(HyperText Mark-up ...

  2. AC自动机总结

    AC自动机的模板 void buildAC() { while(!q.empty()) q.pop(); q.push(); while(!q.empty()) { int x=q.front();q ...

  3. cocos2d游戏界面卡住声音正常播放的问题分析

    cocos2d游戏界面卡住声音正常播放的问题分析 从目前已知的情况看,出现这种情况只可能是设备的内存不够导致的. 从代码上来说内存不够时会调用AppController的“- (void)applic ...

  4. hdu 3853 LOOPS(基础DP求期望)

    题目大意 有一个人被困在一个 R*C(2<=R,C<=1000) 的迷宫中,起初他在 (1,1) 这个点,迷宫的出口是 (R,C).在迷宫的每一个格子中,他能花费 2 个魔法值开启传送通道 ...

  5. 什么是A股、B股、H股、蓝筹股、红筹股

    A股 A股的正式名称是人民币普通股票.它是由我同境内的公司发行,供境内机构.组织或个人(不含台.港.澳投资者)以人民币认购和交易的普通股股票,我国A股股票市场经过几年快速发展,已经初具规模. B股 B ...

  6. 如何搭建配置php开发环境

    PHP的配置 1.打开解压后的C:\Program Files (x86)\php-5.3.5文件夹 1 将php.ini-development文件并更改名称为php.ini(留个备份,好习惯) 2 ...

  7. JLink and JTAG等接口简介

    1.JTAG JTAG用的计算机的并口,JTAG也是一种国际标准测试协议(IEEE 1149.1兼容),主要用于芯片内部测试.现在多数的高级器件都支持JTAG协议,如DSP.FPGA器件等. 标准的J ...

  8. jquery Deferred demo

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. CListView虚拟列表

    首先说下虚拟列表出现的原因: 数据量比较小的时候,对于CListView控件可以直接使用InsertItem并配合SetItemText函数来插入并修改数据.这样操作很直接. 但是,如果数据量比较大了 ...

  10. ava中拦截器 过滤器 监听器都有什么区别

    过滤器,是在java web中,你传入的request,response提前过滤掉一些信息,或者提前设置一些参数,然后再传入servlet或者struts2的action进行业务逻辑,比如过滤掉非法u ...