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 ,以 ...
随机推荐
- pycharm控制台中文乱码问题
pycharm控制台中文乱码问题一般是因为之前有配置保存到了文件里, C盘下.pycharm文件夹下有配置文件,删除文件后重装pycharm,配置会重置 不过最后解决问题的做法是删除配置文件后,重新装 ...
- js 异步请求封装
1. function ajax(url, onsuccess) { var xmlhttp = window.XMLHttpRequest ? new XMLHttpRequest() : new ...
- ubuntu下搭建cocos2dx编程环境-中
上篇文章里讲了在ubuntu下部署cocos2d-x开发环境,这篇文章主要示范在ubuntu下部署cocos2d-x android开发环境.分开写就是因为我看很多文章里都将这两件事情混杂着写 ...
- SQL SERVER ->> Wait Stats
等待状态是隔离SQL SERVER性能问题的一个重要手段,从实例级别入手.可以大概看出SQL SERVER在过去某段时间内是否处于某种资源的吃紧状态.不过取决于你是否有建立有效的性能数据收集机制.sy ...
- 使用qmake生成Makefile
Qmake自动生成Makefile 手动写Makefile是一件痛苦的事情,稍不小心就会出错,不过qmake可以让你脱离苦海 qmake可以根据你提供的.pro文件,生成Makefile不过他可比Ma ...
- 一些practice和总结(转载)
转自 http://boundary.cc/2013/05/java-app-server-develop/ by JOKER on 2013/05/05 最近状态不是很好,负能量堆到积爆表,静下心来 ...
- poj 1180 斜率优化dp
这个题目要是顺着dp的话很难做,但是倒着推就很容易退出比较简单的关系式了. dp[i]=min(dp[u]+(sum[u-1]-sum[i-1]+s)*f[i]);dp[i]代表从i到结尾需要花费的代 ...
- Eclipse下运行Maven项目提示缺少maven-resources-plugin:2.4.3
将一个手动创建的Maven项目(命令行下可正常运行)导入到Eclipse中,运行时提示这样的错误信息:[ERROR] Plugin org.apache.maven.plugins:maven-res ...
- python 中的集合(set) 详解
在Python set是基本数据类型的一种集合类型,它有可变集合(set())和不可变集合(frozenset)两种. 创建集合set.集合set添加.集合删除.交集.并集.差集的操作都是非常实用的方 ...
- python 内建函数 type() 和 isinstance() 介绍
Python 不支持方法或函数重载, 因此你必须自己保证调用的就是你想要的函数或对象.一个名字里究竟保存的是什么?相当多,尤其是这是一个类型的名字时.确认接收到的类型对象的身份有很多时候都是很有用的. ...