在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

nodejs简单层级结构配置文件相关推荐

  1. SpringCloud源码学习笔记之Eureka客户端——DiscoveryClient接口的层级结构

    1.DiscoveryClient接口和类   在SpringCloud框架中,有一个DiscoveryClient接口和一个同名的DiscoveryClient类,其中:DiscoveryClien ...

  2. linux 进程间通信 dbus-glib【实例】详解三 数据类型和dteeth(类型签名type域)(层级结构:服务Service --> Node(对象、object) 等 )(附代码)

    linux 进程间通信 dbus-glib[实例]详解一(附代码)(d-feet工具使用) linux 进程间通信 dbus-glib[实例]详解二(上) 消息和消息总线(附代码) linux 进程间 ...

  3. CVPR 2022 | CNN自监督预训练新SOTA:上交、Mila、字节联合提出具有层级结构的图像表征自学习新框架...

    ©作者 | 机器之心编辑部 来源 | 机器之心 来自上海交通大学.Mila 魁北克人工智能研究所以及字节跳动的研究者提出了一种具有层级语义结构的自监督表征学习框架,在 ImageNet 数据集上预训练 ...

  4. linux文本运行层次,Linux基础知识之---文件系统层级结构

    #Linux基础知识之---文件系统层级结构 @(Linux系统)[基础知识,文件系统,层级结构,FHS] 一切皆文件: 在Linux中,无论是目录.配置.cpu.内存.键盘.鼠标.或者运行中的系统及 ...

  5. Java必突-JVM知识专题(一): Java代码是如何跑起来的+类加载到使用的过程+类从加载到使用核心阶段(类初始化)+类加载的层级结构+什么是JVM的内存区域划分?Java虚拟机栈、Java堆内存

    前言: 该章节知识点梳理:本文主要是入门和了解jvm,不做深入 1.Java代码是如何运行起来的? 2.类加载到使用的过程? 3.验证准备和初始化的过程? 4.类从加载到使用核心阶段:初始化.类加载器 ...

  6. 如何使用Java构造层级结构的树形数据

    层级结构的数据在日常工作中是很常见的,例如:地市层级数据,机构层级数据,单位层级数据等等. 这周在工作中,我就遇到了需要处理层级结构的数据,功能需求很简单:前端有个查询页面,需要根据地市查询相应的数据 ...

  7. CVPR 2022 | CNN自监督预训练新SOTA!上交等联合提出HCSC:具有层级结构的图像表征自学习新框架...

    来源丨机器之心 编辑丨极市平台 层级结构无处不在,自然界中存在「界 - 门 - 纲 - 类 - 科 - 属 - 种」这样的层级关系, 大规模自然图像数据集中也天然存在.例如,ImageNet 数据集的 ...

  8. Linux系统中的层级结构(二级目录)

    linux层级结构标准叫FHS,标准是3 Applications的附件文件中的其他位置中有电脑,其中有子目录如下: 这些子目录是在安装系统时自动建立出来的,称为二级目录,有自己独特的功能,这些独特功 ...

  9. 三级结构_kegg pathway三级层级结构转对应表格

    先上图,如果不是需要的就可以不用往下看了. 首先是什么样的层级结构,如下图,有些长,不完整,完整的图太长上传不了,打开链接https://www.genome.jp/kegg/pathway.html ...

最新文章

  1. 学习之路-现代密码学基础-001
  2. mysql 返回最大值列名_多列求最大值列和列名
  3. 【Android 逆向】修改 Android 的 apk 安装包内的文件并重新打包 ( apktool_2.6.0.jar 下载和使用 | zipalign 文件对齐 | apksigner 签名 )
  4. 【深入Java虚拟机JVM 03】Java内存模型
  5. 计算机科学与技术专业 翻译,计算机科学与技术专业外文翻译--网络.doc
  6. c语言 增删查 案例,C语言实现单链表的增删查改
  7. 全志a33android编译,编译lichee - 全志A33的环境搭建
  8. 前端怎么存token_学长:说说你理解的 Token
  9. Jquery 关于span标签的取值赋值用法
  10. artTemplate模板引擎的源码拜读
  11. EF CodeFirst 学习 1 - 用fluent API设置元数据,
  12. hadoop05---进程线程
  13. 【NOIP1997】【codevs1219】骑士游历
  14. sql查询百分之20到百分之40的数据_FOCUS数据管理之ETL监控
  15. 【黑客免杀攻防】读书笔记15 - 源码免杀、C++壳的编写
  16. 2021财经直播系统 H5网页直播 大区直播间源码
  17. java 安卓 html文件_使用WebView加载本地html网页文件示例
  18. Linux下内存情况分析
  19. 云班课使用浏览器倍速播放插件
  20. Okra框架(三) 搭建HTTP服务器

热门文章

  1. 【图像超分辨率论文】BasicVSR: The Search for Essential Components in Video Super-Resolution and Beyond
  2. Java学习笔记_抽象/接口
  3. python源码多平台编译_ubuntu编译python源码的坑
  4. atftp 在SUSE Linux中的源代码安装配置方法
  5. 浏览器页面关闭事件获取及处理--onbeforeunload
  6. throw 烦人_烦人的简单句子聚类
  7. 一台7纳米光刻机月产能有多大,何为能卖上亿美元?
  8. Vivado抓取信号
  9. 买房贷款被拒,该如何补救?
  10. 操作系统锁的实现方法有哪几种_「从入门到放弃-Java」并发编程-锁-synchronized...