nodejs简单层级结构配置文件

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

由于最近一个项目需要在NodeJS中读取分析后台生成的类XML配置文件,所以凑周末时间写了一个简单层级配置文件的解析类。封装后发布到npmjs,供有需要的同学一起使用。01.简单层级配置文件格式
//定义主配置文件
<main><log>filepath = /data/app/logsfilename = svrrequest.log</log>//定义可用的服务端IP地址<server><ipinfo>host = 192.168.10.58port = 28000</ipinfo><ipinfo>host = 192.168.25.26port = 14000</ipinfo></server>
</main>//定义MySQL数据库访问用户和密码
<mysql>user     = adminpassword = 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;

转载于:https://www.cnblogs.com/motadou/p/3886007.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/258354.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++语言基础(1)-命名空间

一个中大型软件往往由多名程序员共同开发&#xff0c;会使用大量的变量和函数&#xff0c;当有两个人都同时定义了一个名字相同的全局变量或函数的时候&#xff0c;若是把他们的代码整合在一块编译&#xff0c;此时编译器就会提示变量或函数重复定义&#xff0c;C为了解决这个问…

matlab 散点图 线性回归图_线性回归思路梳理

作者&#xff1a;夏雨骄阳 封面&#xff1a;自己想吧1简单线性回归1根据研究目的确定因变量和自变量。2判断有无异常值。通过绘制散点图直观观察&#xff1b;亦可通过线性回归的【统计】→【个案诊断】→【所有个案】进行分析&#xff0c;若标准残差超过[-3,3]&#xff0c;则…

物联网云端设计分析

物联网是世界信息产业发展的新浪潮&#xff0c;智能手表、智能手环、智能灯等物联网产品不断的改变着人们的生活方式。那这些产品是怎么设计出来的呢&#xff1f;其实物联网操作系统不光由本地物联网设备上的操作系统组成&#xff0c;还包括提供物联网终端设备支持的云端架构。…

PHP使用文件流下载文件方法(附:解决下载文件内容乱码问题)

记得高中时候做过游戏私服&#xff0c;那时候的游戏主页是用PHP写的&#xff0c;因为文件很固定&#xff0c;客户端&#xff0c;登陆器和一些小工具&#xff0c;文件数目也不是很多&#xff0c;所以都是直接把下载链接写死的&#xff0c;直接链接到本地服务器的文件目录&#x…

Redis和Memcached的区别

2019独角兽企业重金招聘Python工程师标准>>> Redis的作者Salvatore Sanfilippo曾经对这两种基于内存的数据存储系统进行过比较&#xff1a; Redis支持服务器端的数据操作&#xff1a;Redis相比Memcached来说&#xff0c;拥有更多的数据结构和并支持更丰富的数据操作…

hbase hmaster一会就没了_浅析HBase

一、HBase简介1、Apache HBase™是Hadoop数据库&#xff0c;是一个分布式&#xff0c;可扩展的大数据存储。2、当您需要对大数据进行随机&#xff0c;实时读/写访问时&#xff0c;请使用Apache HBase™。 该项目的目标是托管非常大的表&#xff08; 数十亿的行*百万的列 &#…

【Android工具】DES终结者加密时报——AES加密演算法

转载请注明出处&#xff1a;http://blog.csdn.net/zhaokaiqiang1992在前面的两篇文章中。我们介绍了DES算法&#xff0c;3DES算法以及他们的Android程序实现&#xff0c;并研究了怎样才干实现不同平台下加密算法的一致性。只是话说起来&#xff0c;DES算法是在1976年被美国的国…

MATLAB 迭代法解方程

MATLAB 迭代法解方程 1、代码如下&#xff1a; %%牛顿迭代法解方程 function xnewton_interation(fun,dfun,x0,EPS) %简单牛顿迭代法%fun即迭代函数&#xff0c;dfun即迭代函数的一阶导数&#xff0c;x0为迭代初值&#xff0c;EPS为精度x1x0-fun(x0)/dfun(x0); %牛顿迭代公…

【12期 3月期刊 自荐】

12期的小伙伴看过来~因为网易博客的网络问题。我们把负责收集自荐的博客写到了CSDN里&#xff0c;希望大家在此篇博客的评论里&#xff0c;积极自荐自己的博客。 为了提高大家的积极性&#xff0c;我们评选优秀博客的方法升级为大家自荐博客&#xff0c;博客委员会当月负责人进…

超微服务器电源短接启动图解_教你一招,让你的电脑启动速度秒杀别人

win10快速启动其实是电脑的一种休眠模式&#xff0c;它将电脑中的一些本该关闭的文件保存到hiberfil.sys的磁盘文件中&#xff0c;这样打开电脑时就达到了快速开机的目的。接下来&#xff0c;我就将win10设置快速启动的方法分享给你们win10系统功能非常强大&#xff0c;最让大家…

MATLAB 求离散信号卷积

MATLAB 求离散信号卷积 代码如下&#xff1a; function [C,Ck] dt_convolution_advance(A,B,Ak,Bk) % dt_convolution_advance 计算离散信号卷积 % A 输入信号 % B 输入信号 % Ak 输入信号A下标 % Bk 输入信号B下标 % C 输出信号 % Ck 输出信号C下标 % 计算输入信号A&…

Oracle data type number

Oracle numberNUMBER [ (p [, s]) ]Number having precision p and scale s. Theprecision p can range from 1 to 38. The scale s can range from -84 to 127. Bothprecision and scale are in decimal digits. A NUMBER value requires from 1 to 22bytes.scale是可选的。SQ…

发布 项目_第十八期科创基金项目发布会圆满结束

第十八期科创基金项目发布会圆满结束贺电&#xff01;贺电!电子信息工程学院发来贺电&#xff1a;第十八届科创基金项目发布会圆满结束啦&#xff01;感谢导师们的支持、现场同学的热情参与和科协朋友后勤服务&#xff01;NUAA即使是寒冷的冬天也无法阻挡同学们对科创的热情,那…

Visual Studio .NET、.NET Framework和C#之间的联系

Visual Studio .NET是一种集成开发环境&#xff08;IDE&#xff09;&#xff0c;它包含3种高级程序设计语言&#xff0c;C#就是其中的一种&#xff1b;Visual Studio .NET之所以能把这三种语言有机结合起来并具有与平台无关的特性&#xff0c;其原因在于.NET Framework提供了公…

Fisher线性判别算法原理及实现 MATLAB

Fisher线性判别算法原理及实现 MATLAB 一、Fisher判别器原理 二、代码实现 clc; close all; clear; %% 生成数据 rng(2020); %指定一个种子 mu1 [0 3]; sigma1 [0.5 0; 0 0.5]; data1 mvnrnd(mu1,sigma1,300); %生成一个300*2的矩阵&#xff0c;每一列的数据分别以0&…

大话设计模式之外观模式

年年作品展&#xff0c;岁岁不相同&#xff0c;鹅黄新绿涟漪泛起思想的火花却不尽相同。十期的作品展&#xff0c;从13年3月20号開始到完美落幕&#xff0c;时至今日&#xff0c;她已经在我的记忆中成为过去。这朵小小的浪花激起的涟漪渐渐褪去&#xff0c;或许已没有或许&…

rdp协议打开 windows_CVE-2019-1182 windows 远程桌面RDP协议漏洞修复

原标题&#xff1a;CVE-2019-1182 windows 远程桌面RDP协议漏洞修复2019年8月14日&#xff0c;微软发布更新了windows的系统补丁&#xff0c;代号&#xff1a;CVE-2019-1181&#xff0c;CVE-2019-1182补丁针对与windows远程桌面远程代码执行漏洞进行了全面的修复&#xff0c;根…

HK算法原理及MATLAB实现

HK算法原理及MATLAB实现 一、编程原理 说明&#xff1a; 1、绿色框图中&#xff0c;当alpha取为最优权向量时&#xff0c;会使 取为最小值。arg的意思是当后面那个函数满足时&#xff0c;取出它的自变量的值。 2、注意后面那个式子是对b求偏导 3、e(t)大于0时&#xff0c;下…

软件工程的实践项目的自我目标

对实践项目完成后学习到的能力的预期 1.要学会java的相关知识&#xff0c;并能利用java做一个项目&#xff0c;能知道做一个项目的基本流程。可以先是一个小项目&#xff0c;之后再根据自身情况进行尝试。 2.学会团队协作&#xff0c;之前的数据库实践大多是一个人完成的&#…

《数据驱动安全:数据安全分析、可视化和仪表盘》一1.2.4 统计学

本节书摘来异步社区《数据驱动安全&#xff1a;数据安全分析、可视化和仪表盘》一书中的第1章 &#xff0c;第1.2.4节&#xff0c;[美]杰雅克布&#xff08;Jay Jacobs&#xff09;鲍布鲁迪斯&#xff08;Bob Rudis&#xff09; 著 薛杰 王占一 张卓 胡开勇 蒋梦飏 赵爽 …