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.pswp.cn/news/258354.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/258354.shtml
英文地址,請注明出處:http://en.pswp.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; 著 薛杰 王占一 張卓 胡開勇 蔣夢飏 趙爽 …