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简单层级结构配置文件的更多相关文章
- Linux文件系统的层级结构
Linux文件系统的层级结构 文件结构 倒置的树状结构 :Linux的哲学思想是一切皆文件,把几乎所有资源统统抽象为文件形式:包括硬件设备,甚至通信接口等 根目录 :linux的文件起始均从唯一的 ...
- fhs文件系统层级结构
文件系统:操作系统用于明确存储设备或分区上的文件的方法和数据结构:层次化管理文件的结构就是文件系统: linux层次化文件结构,倒树状结构文件结构 FHS filesystem hie ...
- 如何优化你的布局层级结构之RelativeLayout和LinearLayout及FrameLayout性能分析
转载请注明出处:http://blog.csdn.net/hejjunlin/article/details/51159419 如何优化你的布局层级结构之RelativeLayout和LinearLa ...
- Powershell-查询当前文件目录层级结构
日常工作中我们往往有需要导出当前共享环境或磁盘文件目录层级结构等的需求,最早在目录少的情况下我们使用CMD下tree 命令可以很清晰的看到目录.文件层级结构,那么我们又如何通过powershell直观 ...
- scala的多种集合的使用(1)之集合层级结构与分类
一.在使用scala集合时有几个概念必须知道: 1.谓词是什么? 谓词就是一个方法,一个函数或者一个匿名函数,接受一个或多个函数,返回一个Boolean值. 例如:下面方法返回true或者false, ...
- 文件系统层级结构标准(FHS)
参考资料:FHS 简介 FHS目前发展到3.0版本,发布于2015年6月3日,由Linux基金会在负责维护.它规定了Linux的文件层级结构,使得各Linux发行版.软件开发商知道应该将哪些文件放在哪 ...
- 前端(七)—— 盒模型之display、overflow、隐藏、border、margin、样式支持,层级结构
display.overflow.隐藏.border.margin.样式支持,层级结构 一.盒模型之display 1.三种样式 block 块 inline 内联/行内 inline-block 内 ...
- 使用Python3.7+Django2.0.4配合vue.js2.0的组件递归来实现无限级分类(递归层级结构)
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_133 所谓的无限极分类是啥?其实简单点说就是一个人类可以繁衍出多个后代,然后一个后代又可以分另外多个后代这样无限繁衍下去(可以想象 ...
- iOS-获取UIView的全部层级结构
在iOS中获取UIView的全部层级结构 应用场景 在实际 iOS 开发中,非常多时候都须要知道某个 UI 控件中包括哪些子控件,而且分清楚它们的层级结构和自个的 frame 以及 bounds ,以 ...
随机推荐
- html + css + js注释规范
添加注释到代码中,是一个很好的习惯,而且极大的提高了代码的可读性 1.HTML <!--commentContent--> 2.CSS //commentContent /*comment ...
- Eclipse下Python的MySQLdb的安装以及相关问题
前提是要安装好Python以及eclipse和MySQL的相应版本.本文Python为2.7,MySQL为5.1Eclipse为3.6.2 下载完MySQLdb以后,直接安装即可.在eclipse中启 ...
- (KEIL)MDK5安装与JLINK问题解决方法(支持代码自动补全)
MDK V5在10月8日发布,昨天终于没忍住装上使用了一下,尝了尝鲜. 安装和破解的方法相信各位高手都不在话下,实在不会的可以参考keil4的安装步骤,keil5 和 keil4的安装没有的区别. ...
- ps小技巧
一.加色与减色 电脑显示器和电视是加色法最常见的形式,而在油漆.颜料和彩色滤光片会用减色. 二.怎么把背景变成透明:其实就是抠图. 1.魔术棒+delete,缺点:应用于边界明显的图片,否则容差不好控 ...
- CentOS编译安装Python3
前话 最近想学一下一门新的高级语言,无意中看到用python仿AIphaGo的github项目,就决定是他了. AIphaGo的Git传送门: https://github.com/Rochester ...
- JAVA编译异常处理:java.lang.OutOfMemoryError: PermGen space
在Intellij开发工具中编译JAVA项目,出现以下错误: 六月 21, 2016 6:28:07 下午 org.apache.tomcat.util.modeler.BaseModelMBean ...
- Deeplearning原文作者Hinton代码注解
[z]Deeplearning原文作者Hinton代码注解 跑Hinton最初代码时看到这篇注释文章,很少细心,待研究... 原文地址:>http://www.cnblogs.com/BeDPS ...
- URAL 1250 Sea Burial 简单Floodfill
问这个人掉落的海域包含几个岛屿. 八方向相连为同一片海域,四方向相连为同一个岛屿.与边界相连的岛屿不算. 方法:在给定地图外面填充一圈".",从这个人掉落的地方开始进行floodf ...
- 在LINUX上创建GIT服务器【转】
转自:http://blog.csdn.net/xiongmc/article/details/9176785 如果使用git的人数较少,可以使用下面的步骤快速部署一个git服务器环境. 1. Cli ...
- Java中获取完整的url
Java中获得完整的URl字符串 HttpServletRequest httpRequest=(HttpServletRequest)request; String strBackUrl = &qu ...